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


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

4
Я сделал то же самое в ответе, и мне было указано, что я ввел условие гонки. Идентификаторы процесса могут быть признаны недействительными между вызовами pgrepи kill. Просто используйте pkill.
— Кусалананда

3
@Kusalananda То же самое может произойти и между pkillполучением списка процессов и фактической отправкой сигнала, в этом случае это еще труднее увидеть.
— Хоббс

1
Я собирался составить ответ, который зацикливал бы что-то вроде того, kill $(ps|head -1)чтобы избежать состояния гонки ... но на самом деле нет способа избежать этого. Процесс может умереть в любой точке конвейера.
— Росс Прессер

Просто будьте осторожны с pkill, потому что некоторые программы могут иметь более одного запущенного экземпляра, и вы можете не захотеть убивать их все. Первый запуск pgrep поможет до тех пор, пока другой не запустится между временем запуска pgrep и pkill (гонки).
— Джо

1
Даже программа на C не может избежать состояния гонки, окно будет меньше. Единственный способ сделать это действительно атомарно - добавить системный вызов, который убивает процессы по имени. Но идентификаторы процессов, как правило, не будут повторно использоваться очень быстро, поэтому опасность практически отсутствует.
— Бармар

17

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

killall firefox

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


8
Обратите внимание, что killallу разных Unix-систем разные значения - если вы работаете не в Linux, обязательно ознакомьтесь с документацией.
— Random832

killall -KILL firefoxможет чувствовать себя СООО награждение.
— труба

Непереносимость killall- вот почему я никогда не использую это. Бег killallна поле соляриса, например , катастрофическое.
— Патрик

9

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

$ for proc in $(pgrep <process command>); do kill $proc; done

Я получаю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;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.