Припустимо, у мене є тисяча або більше примірників будь-якого процесу (наприклад, vi
), що працює. Як я вбиваю їх усіх за один постріл / одну команду рядка / одну команду?
Припустимо, у мене є тисяча або більше примірників будь-якого процесу (наприклад, vi
), що працює. Як я вбиваю їх усіх за один постріл / одну команду рядка / одну команду?
Відповіді:
Що не так з добрим старим,
for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done
Є способи зробити це більш ефективним,
for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done
та інші варіанти, але на базовому рівні це завжди працює для мене.
echo kill -9 $pid
перше, так що я знаю, що отримую. Я не впевнений, що AIX має pkill
, це мій хліб і масло UNIX. І чи справді це досить погано, щоб бути голосованим - дивним.
csh
Використовуйте killall,
killall vi
Це вб'є всю команду під назвою "vi"
Ви також можете додати сигнал, наприклад, SIGKILL
killall -9 vi
killall -9 vi
killall
відбувається саме те, що підказує назва ... це вбиває init-процес.
pkill
це те, що я рекомендую, якщо він доступний ( Linux , FreeBSD , NetBSD , OpenBSD , Solaris ). Ви можете вказати процеси за назвою команди, повним командним рядком або іншими критеріями. Наприклад, pkill vi
вбиває всі програми, ім'я команди яких містить підрядку vi
. Щоб вбити лише викликані процеси vi
, використовуйте pkill -x vi
. Щоб вбити лише процеси, викликані vi
останнім аргументом, що закінчується .conf
, використовуйте pkill -fx 'vi.*\.conf'
.
Щоб побачити список PID, на які pkill
буде відправлено сигнал, використовуйте pgrep
, який має абсолютно той самий синтаксис, за винятком того, що він не приймає ім'я або номер сигналу. Щоб побачити більше інформації про ці процеси, запустіть
ps -p "$(pgrep …)"
Під Linux вам потрібно ps -p $(pgrep -d, …)
замість цього (це помилка: Linux ps
не підтримує POSIX).
Ще один поширений спосіб ідентифікації процесів вбивства - це процеси, у яких відкритий певний файл (який може бути виконуваним). Ви можете перелічити їх за допомогою fuser
; використовувати fuser -k
для надсилання їм сигналу. Наприклад, fuser -k /usr/bin/find
вбиває всі запущені випадки find
.
Якщо є відвертий процес, який продовжує розвантажувати, можливо, вам потрібно буде вбити всю групу процесу одразу. Процесна група ідентифікується за негативом її лідера, який є процесом предків усіх процесів у групі. Щоб побачити групу процесів, до якої належить процес, запустіть ps -o pgid
(плюс будь-яку опцію, щоб вибрати, який процес (и) відображати). Якщо ви вирішили , що ви хочете , щоб вбити лідера тисячі двісті тридцять чотири групи процесів і всіх його нащадків, запускати kill -1234
або kill -HUP -1234
будь-якої іншої сигнал.
Якщо ви не можете знайти кращого способу, скористайтеся ps
правильними параметрами, щоб перелічити всі процеси та відфільтрувати їх за допомогою grep
будь-якої іншої команди фільтрації тексту. Слідкуйте за тим, щоб випадково не співставити інші процеси, які, як правило, виконують команду з подібним іменем або з аргументом, який містить це ім'я. Наприклад:
kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')
Пам'ятайте, що ваша команда grep
або awk
сама команда може бути вказана у ps
висновку ( ps
а команда фільтрації запускається паралельно, тож відображатиметься вона чи ні, це залежить від часу). Це особливо важливо, якщо аргументи команд включені у ps
висновок.
pkill
тут дуже приємно. Ви можете надати йому безліч параметрів для вдосконалення структури.
pkill
доступний на Linux, BSD та Solaris - afaik. Тож воно має більший розкид, ніж killall
.
Найпростіший спосіб - це спочатку перевірити, чи ви отримуєте правильні ідентифікатори процесу за допомогою:
pgrep -f [part_of_a_command]
Якщо результат такий, як очікувалося. Супроводжувати:
pkill -f [part_of_a_command]
pgrep -f "command name"
Цікаво про це ніхто не згадував. pidof виводить відокремлені пробілами під-процеси процесів, що відповідають імені переданого процесу. Таким чином, ви можете безпосередньо використовувати його вихід kill
без трубопроводів. У Arch Linux я використовую
kill -9 $(pidof <proc name>)
Мінусом цього рішення є те, що він не дозволяє використовувати регулярні вирази.
Я б запропонував вам спробувати pkill
.
Наприклад: ps -ef | pkill -f command
Щоб показати список усіх процесів, які потрібно вбити, спершу спробуйте pgrep
:
Наприклад: ps -ef | pgrep -f command
ps -ef
в pkill
або pgrep
? Ці команди не читаються зі стандартного вводу.
$ ps -eaf | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill
ps -ef | pgrep -f "search" | xargs kill -9
pkill
зprocps
пакету.