Как я могу убить процесс по имени вместо PID?


350

Иногда, когда я пытаюсь запустить Firefox, он говорит: «Процесс Firefox уже запущен». Так что я должен сделать это:

jeremy@jeremy-desktop:~$ ps aux | grep firefox
jeremy    7451 25.0 27.4 170536 65680 ?        Sl   22:39   1:18 /usr/lib/firefox-3.0.1/firefox
jeremy    7578  0.0  0.3   3004   768 pts/0    S+   22:44   0:00 grep firefox
jeremy@jeremy-desktop:~$ kill 7451

То, что я хотел бы, это команда, которая сделает все это для меня. Он будет принимать входную строку и grepдля нее (или чего-либо еще) в списке процессов, и убьет все процессы в выводе:

jeremy@jeremy-desktop:~$ killbyname firefox

Я пытался сделать это в PHP, но, exec('ps aux')кажется, показывает только процессы, которые были выполнены exec()в самом скрипте PHP (поэтому единственный процесс, который он показывает, это сам).


Когда я получаю окно с сообщением о том, что Firefox уже запущен, мне обычно просто нужно подождать одну секунду, и я снова могу запустить Firefox (конечно, это не всегда так).
— Нуоритовери

1
Это самый безопасный способ, как сказал ДжонБ в этом ответе: stackoverflow.com/questions/6381229/…
— tecnoshopbq


Это старый вопрос, но не могли бы вы изменить принятый ответ? Отмеченный вами сбой во многих процессах, например, запускаемых JVM.
— Луис де Соуза

Для любого, кто ссылается на эту тему, в приведенном выше комментарии Луис ссылается на ответ ниже, который рекламирует pkill -f "Process name"команду ...
— Digger

Ответы:


506
pkill firefox

Дополнительная информация: http://linux.about.com/library/cmd/blcmdl1_pkill.htm


7
Использование pgrep, чтобы выяснить, что вы убиваете, прежде чем приступить к процессу убийства, - это хорошо. Особенно при использовании -f.
— Акрикос

Пкилл не очень дружелюбный. вы не можете дать ему имена так же, как это делает killall.
— Осьминог

2
pkill -U <username>довольно удобно. У меня есть веб-сервер Solaris , настоящий демон веб-сервера, настроенный как служба со своим собственным пользователем. Таким образом, указание пользователем - это простой / легкий способ вызвать перезапуск.
— Raystorm

6
Принудительно убить: pkill -9 firefox
— Юстас

В лучшем случае это работает в половине случаев. Вам нужен хотя бы -fфлаг для комплексного решения.
— Луис де Соуза

112

Также возможно использование:

pkill -f "Process name"

Для меня это сработало идеально. Это было то, что я искал. pkill не работает с именем без флага.

Когда -fустановлено, полная командная строка используется для сопоставления с образцом.


2
специально для запуска что - то с вином-f действительно нужен вариант. напримерpkill -f "EvilWindowsServer.exe"
— CodeBrauer

Это должен быть принятый ответ. Первый ответ терпит неудачу со многими видами программ, например, работающих на JVM.
— Луис де Соуза

1
Мне также пришлось добавить -fфлаг, чтобы убить фоновый процесс, выполняющий скрипт Python.
— Мейсон

в моем случае мне понадобилось 2 флага:pkill -f -9 PROCESSNAME
— Славик

64

Вы можете убить процессы по имени с помощьюkillall <name>

killall отправляет сигнал всем процессам, выполняющим любую из указанных команд. Если имя сигнала не указано, отправляется SIGTERM.

Сигналы могут быть указаны либо по имени (например, -HUP или -SIGHUP ), либо по номеру (например, -1 ), либо с помощью опции -s .

Если имя команды не является регулярным выражением (опция -r ) и содержит косую черту (/), процессы, выполняющие этот конкретный файл, будут выбраны для уничтожения независимо от их имени.

Но если вы не видите процесс с ps aux, вы, вероятно, не будете иметь права убить его ...


6
Чтобы принудительно прервать программу, которая не отвечает, отправьте KILL вместо TERM:killall -s KILL firefox
— Martin Hansen

45

Немного длиннее альтернатива:

kill `pidof firefox`

25
пидоф firefox | xargs kill -9
— hbt 16.12.12

1
этот работает под busybox для ваших встроенных устройств :)
— nwgat

25

Самый простой способ сделать это - сначала проверить, что вы получаете правильные идентификаторы процессов с помощью:

pgrep -f [part_of_a_command]

Если результат соответствует ожиданиям. Идти с:

pkill -f [part_of_a_command]

19

Странно, но я не видел такого решения:

kill -9 `pidof firefox`

он также может убить несколько процессов (несколько pids), таких как:

kill -9 `pgrep firefox`

Я предпочитаю, pidofпоскольку он имеет однострочный вывод:

> pgrep firefox
6316
6565
> pidof firefox
6565 6316

Когда я выполню это, я получил ошибку kill: invalid number 'pidof myprogram'. Что здесь плохого?
— Братлосз

это просто спасло мне жизнь сегодня ... Я не хочу больше писать, но я рад, что нашел это здесь. Спасибо чувак.
— MilMike

1
Опаздывает, но в случае, если кто-то еще задается вопросом ... @Brethlosze вы ставите одиночные галочки, в то время как команда требует обратных галочек.
— спектры

Спасибо! .. я буду (и я буду) знать об этих
— неприятностях

14

Убить все процессы snippetв пути запуска. Вы можете убить все приложения, запущенные из некоторого каталога, добавив / directory / в качестве фрагмента. Это очень полезно, когда вы запускаете несколько компонентов для одного и того же приложения из одного каталога приложений.

ps ax | grep <snippet> | grep -v grep | awk '{print $1}' | xargs kill

* Я бы предпочел pgrep, если доступно


1
Это часто встречающаяся комбинация антипаттернов. Используйте регулярное выражение, которое не соответствует самому себе (или имя содержащего сценарий) и избегайте бесполезногоgrep . ps ax | awk '/[s]nippet/ { print $1 }' | xargs kill
— tripleee

1
избегая бесполезного grep, вы не избегаете опечаток и возможности использовать команду в автоматизированных процессах, которые параметризуют <сниппет>
— Майк

Это действительно лучший способ сделать это!
— Абхинандан Дубей

Было бы здорово понять, почему @ tripleee [s]работает с точки зрения несоответствия самого процесса awk?
— Andig

Потому что регулярное выражение [x]yсоответствует строке, xyа не наоборот. Это общий FAQ. Ссылка на страницу более 20 лет назад, которая объясняет это более подробно; и это был постоянный вопрос уже тогда.
— tripleee

11

На Mac я не смог найти pgrep и pkill, ни killall не работал, поэтому написал простой однострочный скрипт:

export pid=`ps | grep process_name | awk 'NR==1{print $1}' | cut -d' ' -f1`;kill $pid

Если есть более простой способ сделать это, пожалуйста, поделитесь.


1
Ржунимагу. Это безумная команда для такой задачи. Неважно. Вы назвали эту простую одну строку? : D Просто это killall
— m3nda

@ erm3nda :-) Согласен. Оглядываясь назад, это выглядит безумно. Не могу вспомнить, почему killall не работал на моем Mac.
— Дирай

Это очень полезно, когда вы хотите убить определенный процесс Java, такой как «jboss». В этом случае killall не помогает.
— Янв



5

правильнее было бы:

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid

1
Зачем вам exportпеременная, которую вы собираетесь использовать только один раз в одном и том же процессе?
— tripleee


3

Я задавал себе тот же вопрос, но проблема с текущими ответами заключается в том, что они не могут безопасно проверить процессы, которые нужно уничтожить, чтобы ... это могло привести к ужасным ошибкам:) ... особенно, если несколько процессов соответствуют шаблону .

Как заявление об отказе от ответственности, я не профессионал, и, безусловно, есть место для улучшений.

Поэтому я написал небольшой сценарий sh:

#!/bin/sh

killables=$(ps aux | grep $1 | grep -v mykill | grep -v grep)
if [ ! "${killables}" = "" ]
then
  echo "You are going to kill some process:"
  echo "${killables}"
else
  echo "No process with the pattern $1 found."
  return
fi
echo -n "Is it ok?(Y/N)"
read input
if [ "$input" = "Y" ]
then
  for pid in $(echo "${killables}" | awk '{print $2}')
  do
    echo killing $pid "..."
    kill $pid 
    echo $pid killed
  done
fi

2

Если вы запускаете GNOME, вы можете использовать системный монитор (System-> Administration-> System Monitor), чтобы завершать процессы, как в Windows. У KDE будет что-то похожее.


2

Команда по умолчанию killпринимает имена команд в качестве альтернативы PID. Смотрите убить (1) . Часто возникающая проблема заключается в том, что она bashпредоставляет свои собственные, killкоторые принимают номера заданий, например kill %1, но не имена команд. Это мешает команде по умолчанию. Если первая функциональность более полезна для вас, чем последняя, ​​вы можете отключить bashверсию, вызвав

enable -n kill

Для получения дополнительной информации см. killИ enableзаписи в bash (1) .


Как восстановить действие enable -n kill?
— Братлосз

1
@hyprfrcbenable kill
— Ви



0

awk oneliner, который анализирует заголовок psвывода, поэтому вам не нужно заботиться о номерах столбцов (кроме имен столбцов). Поддержка регулярных выражений. Например, чтобы убить все процессы, имя исполняемого файла (без пути) которых содержит слово «firefox», попробуйте

ps -fe | awk 'NR==1{for (i=1; i<=NF; i++) {if ($i=="COMMAND") Ncmd=i; else if ($i=="PID") Npid=i} if (!Ncmd || !Npid) {print "wrong or no header" > "/dev/stderr"; exit} }$Ncmd~"/"name"$"{print "killing "$Ncmd" with PID " $Npid; system("kill "$Npid)}' name=.*firefox.*
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.