Как я могу убить процесс по имени вместо 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

shoosh
источник
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

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

Dhiraj
источник
1
Ржунимагу. Это безумная команда для такой задачи. Неважно. Вы назвали эту простую одну строку? : D Просто это killall
m3nda
@ erm3nda :-) Согласен. Оглядываясь назад, это выглядит безумно. Не могу вспомнить, почему killall не работал на моем Mac.
Дирай
Это очень полезно, когда вы хотите убить определенный процесс Java, такой как «jboss». В этом случае killall не помогает.
Янв
9

Используя #killallкоманду:

#killall -9 <processname>
user2396265
источник
6

Чтобы убить с помощью grep:

kill -9 `pgrep myprocess`
EdW
источник
5

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

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid
Chadiso
источник
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
Ви
1

kill -9 $ (ps aux | grep -e myprocessname | awk '{print $ 2}')

Нивед Танима
источник
0
ps aux | grep processname | cut -d' ' -f7 | xargs kill -9 $
query_port
источник
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.*
Андрей Бочков
источник