web-dev-qa-db-ja.com

単一のプロセスの複数のプロセスIDを削除するにはどうすればよいですか?

次のコードを使用して、特定のプロセスのすべてのPIDを強制終了していますが、期待どおりに機能していません。

pgrep -f <processname>

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

複数のPIDがある場合、上記の行は次のエラーをスローします。

あまりにも多くの引数。

3
Vignesh_A
killall <processname>

killallを使用すると、すべてのプロセスを名前または正規表現(-r)と、プロセスの正しいグループを照合するためのその他のいくつかのオプション。 SIGTERMオプションを使用できます(killall -9 name)。

6
Fiximan

それがpkillの目的です。

pkill -f <processname>

または、mustが必要な場合は、-9を使用します。

pkill -9 -f <processname>

あなたがしようとしていることをするためには、pgrepコマンドのoutputkillに渡す必要があります。代わりに、$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は未定義の変数であるため削除されており、空であり、-femacskillに引数として渡されました。あなたがやりたかったことは、 command Substitution を使用して、あるコマンドの出力を別のコマンドの入力として渡すことでした:

kill $(pgrep -f emacs)

最後に、絶対に必要な場合を除いてkill -9 fooを使用しないでください。kill fooだけでは機能しません。 -9の使用は非常に破壊的であり、プロセスを正常に終了させることができません。

4
terdon