次のコードを使用して、特定のプロセスのすべてのPIDを強制終了していますが、期待どおりに機能していません。
pgrep -f <processname>
kill -9 $(pgrep -f <processname>)
複数のPIDがある場合、上記の行は次のエラーをスローします。
あまりにも多くの引数。
killall <processname>
killall
を使用すると、すべてのプロセスを名前または正規表現(-r
)と、プロセスの正しいグループを照合するためのその他のいくつかのオプション。 SIGTERM
オプションを使用できます(killall -9 name
)。
それがpkill
の目的です。
pkill -f <processname>
または、mustが必要な場合は、-9
を使用します。
pkill -9 -f <processname>
あなたがしようとしていることをするためには、pgrep
コマンドのoutputを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
に引数として渡されました。あなたがやりたかったことは、 command Substitution を使用して、あるコマンドの出力を別のコマンドの入力として渡すことでした:
kill $(pgrep -f emacs)
最後に、絶対に必要な場合を除いてkill -9 foo
を使用しないでください。kill foo
だけでは機能しません。 -9
の使用は非常に破壊的であり、プロセスを正常に終了させることができません。