Припустимо, у мене є тисяча або більше примірників будь-якого процесу (наприклад, 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пакету.