Как убить весь процесс с данным именем?


16

Я запускаю команду ps -A | grep <application_name>и получаю список процессов следующим образом:

19440 ?        00:00:11 <application_name>
21630 ?        00:00:00 <application_name>
22694 ?        00:00:00 <application_name>

Я хочу , чтобы убить весь процесс из списка: 19440, 21630, 22694.

Я пытался, ps -A | grep <application_name> | xargs kill -9 $1но это работает с ошибками.

kill: illegal pid ?
kill: illegal pid 00:00:00
kill: illegal pid <application_name>

Как я могу сделать это изящно?

Ответы:



9

Проблема в том, что ps -A | grep <application_name> | xargs -n1возвращает результат, как это

19440
?
00:00:11
<application_name>
21630
?
00:00:00
<application_name>
22694
?
00:00:00
<application_name>

Вы можете использовать, awkчтобы получить первый столбец psвывода .

ps -A | grep <application_name> | awk '{print $1}' | xargs -n1

Вернет список PID

19440
21630
22694

И добавив, у kill -9 $1вас есть команда, которая убивает все PID

ps -A | grep <application_name> | awk '{print $1}' | xargs kill -9 $1

это идеальный тест я его на Баш скрипт это убивает processer немедленно без ошибок + даже если процесс is'nt начал он не показывает никаких ошибок , который является то , что я хочу, вот пример FFmpeg processer убийцы, nano /usr/bin/ffmpegk . , , , ps -A | grep ffmpeg | awk '{print $1}' | xargs kill -9 $1 , , , , chmod a+rx /usr/bin/ffmpegk
Салем Ф

У меня есть проблема с этим, где я получаю вывод, kill -9если не совпадает ни один процесс
Daniel F

1
Вместо этого grep, вы должны использовать, awkчтобы соответствовать на имя:ps -A | awk "\$4 == \"$1\" { print \$1; }"
Тоби Спейт

0

killall могу сделать это

$ killall application_name

Является ли kill all разрешающим регулярное выражение в имени приложения?
Лукаш Д. Туликовски

killall --regexp "appl.*me"Хотя могут быть разные реализации killall. См man killall.
rudimeier

killall недостаточно, иногда мне нужно отправить его три раза, чтобы завершить процесс, и даже не завершить его, единственное быстро работающее решение для меня, kill -9 pidя думаю, @ ŁukaszD.Tulikowski - лучшее рабочее решение, специально предназначенное для сценариев bash.
Салем Ф

-1
ps -eaf | grep -i applicationname| grep -iv 'grep'| awk '{print "kill -9" " "  $2}'|sh

Хотя я еще не голосовал по этому вопросу, вы не описали, почему это отличается или лучше других решений - которые очень похожи на это - или не описали, почему у ОП были проблемы с их вариацией.
Джефф Шаллер

-2

Мой подход похож на @ Łukasz D. Tulikowski's. Вместо использования grep <application_name>; Я использовал grep "[a]pplication_name", который не совпадает с собственной командной строкой процесса.

Выражение в квадратных скобках является частью grepсопоставления с образцом класса символов. (Ссылка) .


Вы можете использовать, awkчтобы получить первый столбец psвывода.

ps -A | grep "[a]pplication_na" | awk '{print $2}' | xargs -n1

Вернет список PID

7644
407
406

После добавления у kill -9 $1вас есть команда, которая убивает все PID

ps aux | grep "[a]pplication_na" | awk '{print $2}' | xargs kill -9 $1

Почему grepвместо того, awkчтобы делать тест более правильно? grepбудет соответствовать имена, которые включают цель как подстроку, например.
Тоби Спейт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.