Відповіді:
Використовуйте 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просто не вибереш себе за дизайном.
Більше того, якщо ваш візерунок відображатиметься в pss 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просто підрядка імені, чи він містить якісь спеціальні символи для регулярного вираження?