web-dev-qa-db-ja.com

1つのコマンドで実行中のプロセスの多くのインスタンスを強制終了する

実行中のプロセス(たとえば、vi)の1000以上のインスタンスがあるとします。すべてを1つのショット、1つのラインコマンド、1つのコマンドで殺すにはどうすればよいですか。

80
The Dark Knight

古き良きもののどこが悪いのか

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

と他のバリエーションですが、基本的なレベルでは、それは常に私のために働いています。

105
EightBitTony

Killallを使用し、

killall vi

これは 'vi'という名前のすべてのコマンドを強制終了します

シグナルを追加することもできます(例:SIGKILL)

killall -9 vi

39
daisy

pkillは、入手可能であればお勧めです( LinuxFreeBSDNetBSDOpenBSDSolaris )。プロセスは、コマンド名、完全なコマンドライン、またはその他の基準で指定できます。たとえば、_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]
7
Tahsin Turkoz

pkillはここでは非常にいいです。多くのパラメーターを指定して、パターンを調整できます。

7
Nils

興味深いことに、誰もこれについて言及していません。 pidof は、渡されたプロセス名に一致するプロセスのPIDをスペースで区切って出力します。そのため、killを使用して、その出力をパイピングなしで直接使用できます。私が使用するArch Linux

kill -9 $(pidof <proc name>)

このソリューションの欠点は、正規表現を使用できないことです。

3
sherrellbc

pkillを試してみることをお勧めします。

例:ps -ef | pkill -f command

強制終了するすべてのプロセスのリストを表示するには、最初にpgrepを試してください:

例:ps -ef | pgrep -f command

1
Ankit Vashistha

以下のコマンドを使用して、複数の異なるプロセスを強制終了できます

pkill -9 -f "\.\/.+\s\.|process1|process2|process3\[^"

これは、上記のパターンに一致するプロセスを強制終了することに注意してください。つまり、process1abcprocess2defprocess3ghiも殺されます。

0
SandPox

pgrep "name-of-application" | xargs kill -9

覚えるのに十分簡単で、私にとってはうまく機能しました。

0
Horv