Як вбити всі процеси із заданою частковою назвою? [зачинено]


622

Я хочу знищити всі процеси, які я отримую:

ps aux | grep my_pattern

Як це зробити?

Це не працює:

pkill my_pattern

11
Це my_patternпросто підрядка імені, чи він містить якісь спеціальні символи для регулярного вираження?
Свен Марнах

Відповіді:


1317

Використовуйте pkill -f, що відповідає шаблону для будь-якої частини командного рядка

pkill -f my_pattern

7
@Jayan: Це також досить невибірливо в його вбивстві. Це дивно легко
поводитися

1
@Jayan: ти не збираєшся переконувати мене :-). Мене занадто багато разів спалювали сторонні сценарії, які наполягали на використанні pkill- найпоширенішою помилкою є припущення, що в будь-який момент часу може існувати лише один екземпляр кожного бінарного файлу.
thkala

4
Для будь-яких користувачів Mac, які знайшли цю відповідь, як і я, еквівалент Mac є killall -m my_pattern.
Зев Айзенберг

1
Якщо у вас є кілька висячих процесів, які не загинуть, використовуйте pkill -f -9 для нещадного їх вбивства
MacK

18
Я рекомендую pgrepспочатку скористатися, щоб перевірити, що ви збираєтеся вбити. Ви можете використовувати pgrep -lдля перегляду імен процесів або pgrep -aдля перегляду повних командних рядків. Він використовує ті самі прапори, що і pkill. Тож у цьому випадку ви могли б скористатися pgrep -fa my_pattern.
studgeek

158

Вбийте всі процеси, що відповідають рядку "myProcessName":

ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9

Джерело: http://www.commandlinefu.com/commands/view/1138/ps-ef-grep-process-grep-v-grep-awk-print-2-xargs-kill-9

Що робить цей код?

ps -efВидає список ідентифікатора процесу на комп'ютері видимого для користувача. Grep для фільтрує фільтри, що вниз, для рядків, що містять цей рядок. grep -v grepКаже не збігаються на самому процесі , що робить змісту. Друк "awk print" каже, розділіть рядки на пробіл для розділення за замовчуванням і відфільтруйте до другого стовпця, який є нашим ідентифікатором процесу. Труби xargs запускає новий процес для надсилання всіх цих під kill -9, закінчуючи їх усі.

Вищеописаний код є поганим, небезпечним, некрасивим та хакерським з кількох причин.

  1. Якщо з примусовим кодом виконується будь-яка операційна база даних або захищені транзакції з умовами перегонів з низькою вірогідністю, частина частки часу, атомність цієї транзакції буде зірвана, спричиняючи невизначене поведінку. убивати -9 не приймає в'язнів. Якщо ваш код чутливий до цього, спробуйте замінити його xargs killчастиною на переданий прапор, який вимагає витонченого відключення, і лише якщо цей запит буде відхилено, в останню чергу вдайтеся доkill -9

  2. Існує не нульова можливість, що ви випадково закінчите операційну систему або спричинили не визначену поведінку в неспорідненому процесі, що призведе до нестабільності всієї системи, тому що ps -efперераховані всі можливі процеси, які могли існувати, і ви не можете бути впевнені, що якась дивна стороння бібліотека ділиться вашими ім'я процесу, або що за час між читанням та виконанням kill -9, processid змінився на щось інше, і тепер ви випадково закінчили якийсь випадковий процес, якого ви не мали наміру.

Але, якщо ви розумієте ризики і контролюєте їх за допомогою дуже унікальних імен, і ви все гаразд з кількома відхиленими трансакціями або випадковими пошкодженнями даних, то 99,9% часу вам буде добре. Якщо є проблема, перезавантажте комп’ютер, переконайтеся, що немає зіткнень з процесами. Саме завдяки такому коду, що робить сценарій технічної підтримки: "Ви спробували перезапустити комп'ютер", мем 5 рівня.


15
Це призведе до помилки, якщо не буде знайдено жодного процесу, що відповідає імені. Ви можете використовувати, ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9щоб xargs не виконував команду, якщо аргументи не наводяться.
Епіген

2
Лише невелика модифікація, можливо, краще навести ім'я процесу: ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9 Без лапок, лише один із моїх фонових процесів був убитий під час першого запуску. Запуск його знову вбив решту.
Алі Хайдер

-rопція не існує в OS X, так здається.
Даніель

52

Якщо вам потрібна більша гнучкість у виборі процесів використання

for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do 
  kill -9 $KILLPID;
done

Ви можете використовувати grep -e тощо.


4
-1 Вам не потрібен цикл, ви можете просто kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`(зверніть увагу також на рефакторинг; дивіться також мій коментар до відповіді @ синтезаторпателя).
tripleee

11
@tripleee Немає проблем з downvote, але ви робите Усвідомте, що OQ був «Я хочу , щоб вбити всі процеси , які я отримую від: пс Окс | Grep my_pattern» , який я dutyfully погодився.
Євген Рік

Kill знищить усі процеси за один раз, вам не потрібна петля для цього. Якщо psповертає три процеси 123, 234 та 345, ви можете kill 123 234 345просто так, як ви можете rmчи catкілька аргументів файлів.
tripleee

@tripleee I ment видаленняgrep
Eugen Rieck

for KILLPID in ps ax | греп 'пума' | grep -v ‘grep’ | awk '{print $ 1;}' ; do kill -9 $KILLPID; doneвидалить греп
Justin E

18

Ви можете використовувати наступну команду для переліку процесу

ps aux | grep -c myProcessName 

якщо вам потрібно перевірити кількість цього процесу, тоді запустіть

ps aux | grep -c myProcessName |grep -v grep 

після чого ви можете вбити процес, використовуючи

kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }') 

Ви можете скористатися наступною командою для переліку процесу ps aux | grep -c myProcessName, якщо вам потрібно перевірити кількість цього процесу, тоді запустіть ps aux | grep -c myProcessName | grep -v grep, після якого ви можете вбити процес, використовуючи kill -9 $ (ps aux | grep -e myProcessName | awk '{print $ 2}')
Nived Thanima

13

Також ви можете використовувати killall -r my_pattern. -rІнтерпретувати шаблон імені процесу як розширений регулярний вираз.

killall -r my_pattern

8

Якщо ви судите pkill -f PATTERNтрохи надто небезпечно, я написав ezkill bash-скрипт, який запропонує вам вибрати, які процеси серед тих, що відповідають ПАТЕРНУ, який ви хочете вбити.


7

Ви можете використовувати наступну команду для

kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')

4

Якщо ви не хочете боліти за пошук ідентифікатора процесу, використовуйте regexp, щоб вбити процес на ім'я. Наприклад, вбити хром наступний код зробить трюк.

killall -r --regexp chrome


1
Вам потрібен лише або, -r або --regexp короткий і довгий варіант GNU відповідно.
BigSmoke

3

Ви можете використовувати таку команду, щоб:

ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9

або

ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9

Це працює для мене.


1
Ласкаво просимо до StackOverflow. Будь ласка, використовуйте 4-пробіл чи вкладку для вкладки для кодових рядків, щоб вони були відформатовані як кодові блоки. З найкращими побажаннями
YakovL

2

Звучить погано?

 pkill `pidof myprocess`

приклад:

# kill all java processes
pkill `pidof java`

2

Знайшов найкращий спосіб зробити це для сервера, який не підтримує pkill

kill -9 $(ps ax | grep My_pattern| fgrep -v grep | awk '{ print $1 }')

Вам не доведеться циклічно.


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$"

man pkill


0

Я взяв відповідь Євгена Ріка і працював з нею. Мій код додає наступне:

  1. ps ax включає в себе grep, тому я виключив його grep -Eiv 'grep'
  2. Додано декілька ifs та відгомонів, щоб зробити його читабельним.

Я створив файл, назвав його 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

0

Це шлях:

kill -9 $(pgrep -d' ' -f chrome)

3
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як та / або чому він вирішує проблему, покращить довгострокове значення відповіді.
Ігор Ф.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.