Как убить несколько процессов

21

чтобы найти PID процесса, который нужно убить, используйте:

pgrep <process command>

Затем я использую команду kill, чтобы убить PID, возвращенный pgrep <process command>

kill <PID>

Можно ли объединить эти команды в одну, чтобы убить PID или PID, возвращенные pgrep <process command>? Или есть способ убить несколько процессов по имени команды?

Что-то типа : kill(pgrep <name of process>)

голубое небо
источник
3
Ты пробовал pkill? В качестве альтернативы, вы можете использовать xargs.
MatthewRock
1
Обратите внимание, что справочные страницы также хороши для подобных вещей. Часто они не только говорят вам, как использовать команду, они также говорят вам о связанных командах. В этом случае pgrepстраница руководства упоминается pkillповсеместно (так как 2 команды приходят из одного пакета).
Патрик

Ответы:

27

Вы можете использовать pkill:

pkill httpd

Вы также можете использовать подстановку процесса (хотя это не так ясно):

kill $(pgrep command)

И вы можете использовать xargs:

pgrep command | xargs kill
MatthewRock
источник
4
Я сделал то же самое в ответе, и мне было указано, что я ввел условие гонки. Идентификаторы процесса могут быть признаны недействительными между вызовами pgrepи kill. Просто используйте pkill.
Кусалананда
3
@Kusalananda То же самое может произойти и между pkillполучением списка процессов и фактической отправкой сигнала, в этом случае это еще труднее увидеть.
Хоббс
1
Я собирался составить ответ, который зацикливал бы что-то вроде того, kill $(ps|head -1)чтобы избежать состояния гонки ... но на самом деле нет способа избежать этого. Процесс может умереть в любой точке конвейера.
Росс Прессер
Просто будьте осторожны с pkill, потому что некоторые программы могут иметь более одного запущенного экземпляра, и вы можете не захотеть убивать их все. Первый запуск pgrep поможет до тех пор, пока другой не запустится между временем запуска pgrep и pkill (гонки).
Джо
1
Даже программа на C не может избежать состояния гонки, окно будет меньше. Единственный способ сделать это действительно атомарно - добавить системный вызов, который убивает процессы по имени. Но идентификаторы процессов, как правило, не будут повторно использоваться очень быстро, поэтому опасность практически отсутствует.
Бармар
17

Вы также можете использовать killall, например,

killall firefox

отправить SIGTERMвсем firefoxпроцессам.

Byte Commander
источник
8
Обратите внимание, что killallу разных Unix-систем разные значения - если вы работаете не в Linux, обязательно ознакомьтесь с документацией.
Random832
killall -KILL firefoxможет чувствовать себя СООО награждение.
труба
Непереносимость killall- вот почему я никогда не использую это. Бег killallна поле соляриса, например , катастрофическое.
Патрик
9

Да, вы можете использовать функцию bash и перебирать вывод.

$ for proc in $(pgrep <process command>); do kill $proc; done
lcipriani
источник
Я получаюkill <no>:failed: operation not permitted
Тимо
Возможно, у вас нет необходимых прав доступа или процесс больше не существует, обратитесь по
адресу
0

Вы можете убить несколько процессов с массивом. В этом случае вы можете указать параметры как $ip, $hostnameили что-то подобное.

ip=your_ip_address; declare -a arr=$(ps aux|grep tail|grep $ip|awk '{print $2}'); for pid in ${arr[@]}; do kill -9 $pid; done;
Владислав Грейсвандир
источник