Как я могу убить процесс по имени вместо PID? - PullRequest
298 голосов
/ 02 октября 2008

Иногда, когда я пытаюсь запустить 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 (поэтому единственный процесс, который он показывает, это сам.)

Ответы [ 17 ]

447 голосов
/ 02 октября 2008
pkill firefox

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

84 голосов
/ 07 января 2015

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

pkill -f "Process name".

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

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

61 голосов
/ 02 октября 2008

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

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

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

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

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

40 голосов
/ 02 октября 2008

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

kill `pidof firefox`
16 голосов
/ 12 июля 2016

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

pgrep -f [part_of_a_command]

Если результат соответствует ожидаемому. Перейти с:

pkill -f [part_of_a_command]
14 голосов
/ 02 октября 2016

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

kill -9 `pidof firefox`

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

kill -9 `pgrep firefox`

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

> pgrep firefox
6316
6565
> pidof firefox
6565 6316
10 голосов
/ 22 февраля 2013

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

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

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

8 голосов
/ 18 мая 2013

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

#killall -9 <processname>
7 голосов
/ 05 апреля 2017

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

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

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

5 голосов
/ 14 ноября 2014

Убить с помощью grep:

kill -9 `pgrep myprocess`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...