Відповіді:
Використовуйте pkill -f
, що відповідає шаблону для будь-якої частини командного рядка
pkill -f my_pattern
pkill
- найпоширенішою помилкою є припущення, що в будь-який момент часу може існувати лише один екземпляр кожного бінарного файлу.
killall -m my_pattern
.
pgrep
спочатку скористатися, щоб перевірити, що ви збираєтеся вбити. Ви можете використовувати pgrep -l
для перегляду імен процесів або pgrep -a
для перегляду повних командних рядків. Він використовує ті самі прапори, що і pkill. Тож у цьому випадку ви могли б скористатися pgrep -fa my_pattern
.
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
Що робить цей код?
ps -ef
Видає список ідентифікатора процесу на комп'ютері видимого для користувача. Grep для фільтрує фільтри, що вниз, для рядків, що містять цей рядок. grep -v grep
Каже не збігаються на самому процесі , що робить змісту. Друк "awk print" каже, розділіть рядки на пробіл для розділення за замовчуванням і відфільтруйте до другого стовпця, який є нашим ідентифікатором процесу. Труби xargs запускає новий процес для надсилання всіх цих під kill -9
, закінчуючи їх усі.
Вищеописаний код є поганим, небезпечним, некрасивим та хакерським з кількох причин.
Якщо з примусовим кодом виконується будь-яка операційна база даних або захищені транзакції з умовами перегонів з низькою вірогідністю, частина частки часу, атомність цієї транзакції буде зірвана, спричиняючи невизначене поведінку. убивати -9 не приймає в'язнів. Якщо ваш код чутливий до цього, спробуйте замінити його xargs kill
частиною на переданий прапор, який вимагає витонченого відключення, і лише якщо цей запит буде відхилено, в останню чергу вдайтеся доkill -9
Існує не нульова можливість, що ви випадково закінчите операційну систему або спричинили не визначену поведінку в неспорідненому процесі, що призведе до нестабільності всієї системи, тому що ps -ef
перераховані всі можливі процеси, які могли існувати, і ви не можете бути впевнені, що якась дивна стороння бібліотека ділиться вашими ім'я процесу, або що за час між читанням та виконанням kill -9, processid змінився на щось інше, і тепер ви випадково закінчили якийсь випадковий процес, якого ви не мали наміру.
Але, якщо ви розумієте ризики і контролюєте їх за допомогою дуже унікальних імен, і ви все гаразд з кількома відхиленими трансакціями або випадковими пошкодженнями даних, то 99,9% часу вам буде добре. Якщо є проблема, перезавантажте комп’ютер, переконайтеся, що немає зіткнень з процесами. Саме завдяки такому коду, що робить сценарій технічної підтримки: "Ви спробували перезапустити комп'ютер", мем 5 рівня.
ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9
щоб xargs не виконував команду, якщо аргументи не наводяться.
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
Без лапок, лише один із моїх фонових процесів був убитий під час першого запуску. Запуск його знову вбив решту.
-r
опція не існує в OS X, так здається.
Якщо вам потрібна більша гнучкість у виборі процесів використання
for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do
kill -9 $KILLPID;
done
Ви можете використовувати grep -e тощо.
kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`
(зверніть увагу також на рефакторинг; дивіться також мій коментар до відповіді @ синтезаторпателя).
ps
повертає три процеси 123, 234 та 345, ви можете kill 123 234 345
просто так, як ви можете rm
чи cat
кілька аргументів файлів.
grep
for KILLPID in
ps ax | греп 'пума' | grep -v ‘grep’ | awk '{print $ 1;}' ; do kill -9 $KILLPID; done
видалить греп
Ви можете використовувати наступну команду для переліку процесу
ps aux | grep -c myProcessName
якщо вам потрібно перевірити кількість цього процесу, тоді запустіть
ps aux | grep -c myProcessName |grep -v grep
після чого ви можете вбити процес, використовуючи
kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }')
Ви можете використовувати таку команду, щоб:
ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9
або
ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9
Це працює для мене.
Звучить погано?
pkill `pidof myprocess`
приклад:
# kill all java processes
pkill `pidof java`
Знайшов найкращий спосіб зробити це для сервера, який не підтримує pkill
kill -9 $(ps ax | grep My_pattern| fgrep -v grep | awk '{ print $1 }')
Вам не доведеться циклічно.
це краще і безпечніше використовувати pgrep -f
з kill
, або просто pkill -f
, grep
ІНГ ps
вихід «s може піти не так.
На відміну від використання ps | grep
допомогою якого вам потрібно відфільтрувати лінію грепа, додавши | grep -v
або використовуючи трюкові візерунки, pgrep
просто не вибереш себе за дизайном.
Більше того, якщо ваш візерунок відображатиметься в ps
s UID
/ USER
,SDATE
/ START
або будь-якому іншому стовпці, ви отримаєте небажані процеси у виході та вб'єте їх, pgrep
+pkill
не постраждайте від цього недоліку.
також я виявив, що killall -r
/ -regexp
не працював зі своїм регулярним виразом.
pkill -f "^python3 path/to/my_script$"
Я взяв відповідь Євгена Ріка і працював з нею. Мій код додає наступне:
ps ax
включає в себе grep, тому я виключив його grep -Eiv 'grep'
Я створив файл, назвав його killserver
, ось він іде:
#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
if [ ! -z $KILLPID ];then
kill -9 $KILLPID
echo "Killed PID ${KILLPID}"
KILLED=yes
fi
done
if [ -z $KILLED ];then
echo "Didn't kill anything"
fi
Результати
➜ myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
➜ myapp git:(master) bash killserver
Didn't kill anything
my_pattern
просто підрядка імені, чи він містить якісь спеціальні символи для регулярного вираження?