実行中のプロセス(たとえば、vi
)の1000以上のインスタンスがあるとします。すべてを1つのショット、1つのラインコマンド、1つのコマンドで殺すにはどうすればよいですか。
古き良きもののどこが悪いのか
for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done
それをより効率的にする方法があります、
for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done
と他のバリエーションですが、基本的なレベルでは、それは常に私のために働いています。
Killallを使用し、
killall vi
これは 'vi'という名前のすべてのコマンドを強制終了します
シグナルを追加することもできます(例:SIGKILL)
killall -9 vi
pkill
は、入手可能であればお勧めです( Linux 、 FreeBSD 、 NetBSD 、 OpenBSD 、 Solaris )。プロセスは、コマンド名、完全なコマンドライン、またはその他の基準で指定できます。たとえば、_pkill vi
_は、コマンド名に部分文字列vi
が含まれているすべてのプログラムを強制終了します。 vi
と呼ばれるプロセスのみを強制終了するには、_pkill -x vi
_を使用します。最後の引数が_.conf
_で終わるvi
と呼ばれるプロセスのみを強制終了するには、_pkill -fx 'vi.*\.conf'
_を使用します。
pkill
が信号を送信するPIDのリストを表示するには、pgrep
を使用します。これは、信号名または番号を受け入れないことを除いて、まったく同じ構文です。これらのプロセスの詳細を表示するには、次を実行します。
_ps -p "$(pgrep …)"
_
Linuxでは、代わりにps -p $(pgrep -d, …)
が必要です(これはバグです。Linuxのps
はPOSIXに準拠していません)。
強制終了するプロセスを特定するもう1つの一般的な方法は、特定のファイルを開いているプロセスです(プロセスの実行可能ファイルである場合があります)。これらは fuser
;でリストできます。 _fuser -k
_を使用して信号を送信します。たとえば、_fuser -k /usr/bin/find
_は、find
の実行中のすべてのインスタンスを強制終了します。
フォークし続ける暴走プロセスがある場合は、 プロセスグループ 全体を一度に強制終了する必要がある場合があります。プロセスグループは、そのリーダーのネガで識別されます。これは、グループ内のすべてのプロセスの祖先プロセスです。プロセスが属するプロセスグループを表示するには、_ps -o pgid
_を実行します(さらに、表示するプロセスを選択するオプションがあります)。プロセスグループリーダー1234とそのすべての子を強制終了する場合は、_kill -1234
_または_kill -HUP -1234
_またはその他のシグナルを実行します。
より良い方法が見つからない場合は、適切なオプションを指定してps
を使用し、すべてのプロセスを一覧表示して、grep
またはその他のテキストフィルタリングコマンドでフィルタリングします。同じ名前のコマンドまたはその名前を含む引数を使用してコマンドを実行している他のプロセスに誤って一致しないように注意してください。例えば:
_kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')
_
grep
またはawk
コマンド自体がps
出力にリストされる場合があることに注意してください(ps
とフィルタリングコマンドが並行して開始されるため、現れるかどうかはタイミングに依存します)。これは、コマンド引数がps
出力に含まれている場合に特に重要です。
最も簡単な方法は、まず次の方法で正しいプロセスIDを取得していることを確認することです。
pgrep -f [part_of_a_command]
結果が期待どおりである場合。と一緒に行きます:
pkill -f [part_of_a_command]
pkill
はここでは非常にいいです。多くのパラメーターを指定して、パターンを調整できます。
興味深いことに、誰もこれについて言及していません。 pidof は、渡されたプロセス名に一致するプロセスのPIDをスペースで区切って出力します。そのため、kill
を使用して、その出力をパイピングなしで直接使用できます。私が使用するArch Linux
kill -9 $(pidof <proc name>)
このソリューションの欠点は、正規表現を使用できないことです。
pkill
を試してみることをお勧めします。
例:ps -ef | pkill -f command
強制終了するすべてのプロセスのリストを表示するには、最初にpgrep
を試してください:
例:ps -ef | pgrep -f command
以下のコマンドを使用して、複数の異なるプロセスを強制終了できます
pkill -9 -f "\.\/.+\s\.|process1|process2|process3\[^"
これは、上記のパターンに一致するプロセスを強制終了することに注意してください。つまり、process1abc
process2def
process3ghi
も殺されます。
pgrep "name-of-application" | xargs kill -9
覚えるのに十分簡単で、私にとってはうまく機能しました。