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


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.