Я использую следующий код для уничтожения всех PID определенного процесса, но он не работает должным образом.
pgrep -f <processname>
kill -9 $(pgrep -f <processname>)
, когда имеется более одного PID, в приведенной выше строке выдается сообщение об ошибке:
слишком много аргументов.
killall <processname>
killall
позволяет уничтожать все процессы по имени или даже regexes (-r
) и несколько других опций для соответствия корректной группе процессов. SIGTERM
опции доступны (killall -9 name
).
Это что 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
может быть довольно разрушительным и не позволяет процессу выйти корректно.