Как удалить несколько идентификаторов процессов одного процесса?

Я использую следующий код для уничтожения всех PID определенного процесса, но он не работает должным образом.

pgrep -f <processname>

kill -9 $(pgrep -f <processname>)

, когда имеется более одного PID, в приведенной выше строке выдается сообщение об ошибке:

слишком много аргументов.

3
задан 4 July 2019 в 15:36

2 ответа

killall <processname>

killall позволяет уничтожать все процессы по имени или даже regexes (-r) и несколько других опций для соответствия корректной группе процессов. SIGTERM опции доступны (killall -9 name).

5
ответ дан 1 December 2019 в 13:14

Это что pkill для:

pkill -f <processname>

Или, если необходимо использовать -9:

pkill -9 -f <processname>

Чтобы сделать то, чего Вы делали попытку, необходимо будет передать вывод pgrep команда к kill. Вместо этого Вы передаете названную переменную $pgrep который, конечно, не имеет никакого значения. Вы видите это путем выполнения команды после включения set -x:

$ set -x
$ kill -9 $pgrep -f emacs
+ kill -9 -f emacs
sh: kill: -f: arguments must be process or job IDs
sh: kill: emacs: arguments must be process or job IDs

(выполненный set +x отключить информацию об отладке)

Поскольку Вы видите выше, $pgrep был удален, так как это - неопределенная переменная, и поэтому пустой, и -f и emacs были переданы как аргументы kill. То, что Вы хотели сделать, было использовать замену команды для передачи вывода одной команды, как введено другому:

kill $(pgrep -f emacs)

Наконец, избегать использования kill -9 foo если это не абсолютно необходимо и kill foo один не работает. Используя -9 может быть довольно разрушительным и не позволяет процессу выйти корректно.

3
ответ дан 1 December 2019 в 13:14

Другие вопросы по тегам:

Похожие вопросы: