Як вбити кілька процесів


21

щоб знайти PID процесу вбивства для використання:

pgrep <process command>

Потім я використовую команду kill, щоб вбити PID, повернений pgrep <process command>

kill <PID>

Чи можна ці команди об'єднати в одну, щоб вбити PID або PID, повернуті pgrep <process command>? Або існує метод вбити кілька процесів за назвою команди?

Щось на зразок : kill(pgrep <name of process>)


3
Ви пробували pkill? Можна також скористатися xargs.
MatthewRock

1
Зауважте, що чоловічі сторінки також хороші для таких матеріалів. Часто вони не лише розповідають, як використовувати команду, але й розповідають про пов'язані команди. У цьому випадку pgrepвказівна сторінка згадується pkillвсюди (оскільки дві команди надходять з одного пакету).
Патрік

Відповіді:


27

Ви можете використовувати pkill:

pkill httpd

Ви також можете використовувати підстановку процесу (хоча це не так зрозуміло):

kill $(pgrep command)

І ви можете скористатися xargs:

pgrep command | xargs kill

4
Я зробив подібну річ у відповіді, і мені було вказано, що я ввів умову гонки. Ідентифікатори процесу можуть бути недійсними між дзвінками до pgrepта kill. Просто використовуйте pkill.
Kusalananda

3
@Kusalananda те ж саме може трапитися і між pkillотриманням списку процесів і фактичним надсиланням сигналу, в цьому випадку це просто важче побачити.
варення

1
Я збирався спробувати скласти відповідь, яка цикла щось на кшталт kill $(ps|head -1)уникнення перегонів ... але насправді немає способу уникнути цього. Процес може загинути в будь-якій точці трубопроводу.
Росс Пресер

Будьте обережні з pkill, тому що в деяких програмах працює більше ніж один екземпляр, і ви, можливо, не захочете вбивати їх усіх. Перший запуск pgrep допоможе до тих пір, поки інший не почнеться між часом запуску pgrep та pkill (race).
Джо

1
Навіть програма C не може уникнути умови гонки, вікно буде просто меншим. Єдиний спосіб зробити це по-справжньому атомним - це додати системний виклик, який вбиває процеси за назвою. Але ідентифікатори процесу, як правило, не будуть використані дуже швидко, тому небезпека практично не існує.
Бармар

17

Ви можете використовувати killallтакож, наприклад,

killall firefox

відправити SIGTERMна всі firefoxпроцеси.


8
Зауважте, що killallв різних системах Unix є різні значення - якщо ви не в системі Linux, переконайтеся, що перегляньте документацію.
Випадково832

killall -KILL firefoxможе відчувати себе СТОВ нагородження.
труба

Непереносимість killall, чому я ніколи не використовую її. killallНаприклад, працювати на коробці Solaris - згубно.
Патрік

9

Так, ви можете використовувати функцію bash та перекидання на вихід.

$ for proc in $(pgrep <process command>); do kill $proc; done

Я отримуюkill <no>:failed: operation not permitted
Тимо

Ймовірно, у вас немає правильних дозволів або процес більше не існує, зверніться до: superuser.com/questions/1175485/…
lcipriani

0

Ви можете вбити кілька процесів за допомогою масиву. В цьому випадку ви можете вказати параметри , як $ip, $hostnameчи що - щось подібне.

ip=your_ip_address; declare -a arr=$(ps aux|grep tail|grep $ip|awk '{print $2}'); for pid in ${arr[@]}; do kill -9 $pid; done;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.