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


75

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


3
これがどのシステムで機能するかは不明です。たとえば、Linuxではpkillfrom procpsパッケージを使用します。
鹿ハンター

質問は一般的な観点から尋ねられました。killallとawk / sedのような2つのプロセスのみを知っていました。しかし、私はこれを達成する他の方法があるかどうかを知りたかった。異なるシステムで異なる方法で実行される場合は、どのシステムで何が必要かを知りたいです。グーグルはとても面倒です。代わりに、経験豊富な皆さんと話し合うことを考えました。
ダークナイト

回答:


97

古き良き時代の何が問題なのか、

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

その他のバリエーションもありますが、基本的なレベルでは常に機能します。


1
最初のバリエーションのみを知っていました。2番目はより効率的に見えます、ありがとう。
ダークナイト

5
@TheDarkKnightこの方法の問題は、意図した以上に多くの人を殺してしまうことです。信頼できる「検索」を書くのは難しいです。Linuxでは、ほとんどの微妙な点を処理するpkillを使用します
ジル

特定のバイナリを使用している場合は、かなり信頼できる可能性があります。echo kill -9 $pidとにかく最初に実行するので、何が得られるのかがわかります。AIXがを持っているかどうかはわかりませんがpkill、これは私のパンとバターUNIXです。そして、それはダウン投票されるのに本当に悪いのですか?
EightBitTony

1
どうしても必要な場合を除き、SIGKILLの代わりにプロセスSIGTERMを送信する必要があります。

私は、例えばそれが動作しませんこれらの2つの方法は、すべてのシェルでは動作しないことを追加する必要がありますcsh
非sequitor

38

killallを使用して、

killall vi

これにより、「vi」という名前のすべてのコマンドが強制終了されます

SIGKILLなどのシグナルも追加できます。

killall -9 vi


そうです、あなたも同じように、あなたがしたい信号を追加することができますkillall -9 vi
はいはい醤油エドゥフェリスナヴィダード

1
killallがそれを解決するとは思いません。ファイルによる強制終了は、実行中に開いたままになっている実行可能ファイルに対してのみ機能します。killall nameを入力すると、特に特権ユーザーがLinux以外のシステムで望ましい効果を発揮しない場合があります。Linux以外のプロセスのインスタンスを多数削除しようとするとどうなりますか。killall -wは、プロセスが消失したかどうかを検出せず、スキャン間で同じPIDを持つ新しいプロセスに置き換えられます。プロセスの名前が変更された場合、killallはそれらを正しく一致させることができない場合があります。
ダークナイト

13
これはLinuxおよびBSDでのみ機能することに注意してください。Solarisや他のいくつかのシステムでkillallは、名前が示すとおりのことをしています... initプロセスを強制終了します。
ボビー

2
AIXでは、「killallプロセスを生成するプロセスを除く、開始したすべてのプロセスをキャンセルします。」
EightBitTony

31

pkill入手可能であれば(LinuxFreeBSDNetBSDOpenBSDSolaris)、私が推奨するものです。プロセスは、コマンド名、完全なコマンドライン、またはその他の基準で指定できます。たとえばpkill vi、コマンド名にサブストリングが含まれるすべてのプログラムを強制終了しますvi。呼び出されたプロセスのみを強制終了するにはvi、を使用しますpkill -x vivi最後の引数がで終わるプロセスのみを強制終了するには.conf、を使用しますpkill -fx 'vi.*\.conf'

pkill信号を送信するPIDのリストを表示するにはpgrep、を使用します。これは、信号名または信号番号を受け入れないことを除いて、まったく同じ構文を持ちます。これらのプロセスに関する詳細を表示するには、次を実行します

ps -p "$(pgrep …)"

Linuxでは、ps -p $(pgrep -d, …)代わりに必要です(これはバグです:Linux psはPOSIXに準拠していません)。

強制終了するプロセスを特定する別の一般的な方法は、特定のファイルを開いているプロセスです(プロセスの実行可能ファイルである可能性があります)。これらをリストするには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出力に含まれる場合に特に重要です。


本当にありがとう、これは本当に素晴らしい。あなたが与えたことは、一種のチュートリアルです。再度、感謝します 。賛成投票
ダークナイト

6

pkillここはとてもいいです。パターンを調整するために、多くのパラメーターを指定できます。


すべてのUNIXで利用できるわけではなく、質問で特定のUNIXまたはUNIXライクなOSについての言及もありません。
EightBitTony

@EightBitTony pkillはLinux、BSD、およびSolaris-afaikで利用可能です。だから、よりも大きな広がりを持っていkillallます。
ニルス

私は同意しますが、同じ名前の複数のツールがあり、動作が劇的に異なるように見えるため、killallにはさらに問題があります。killallの回答も好きではありません。pkillはAIXやHP-UXには存在せず、一部の人々が信じたいと思っていることにも関わらず、まだ世界中にLinux以外のUNIXをベースにしたものがかなりあります。
EightBitTony

1
@EightBitTonyがあなたの答えが受け入れられる理由です。しかし、Solaris(これもUnix)では使用しません。
ニルス

6

最も簡単な方法は、最初に正しいプロセスIDを取得していることを確認することです。

pgrep -f [part_of_a_command]

結果が期待どおりの場合。と一緒に行きます:

pkill -f [part_of_a_command]

または使用:pgrep -f "command name"
マグネ

3

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

kill -9 $(pidof <proc name>)

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


0

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

例: ps -ef | pkill -f command

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

例: ps -ef | pgrep -f command


1
出力配管目的は何であるps -efpkillかはpgrep?これらのコマンドは、標準入力から読み取りません。
クサラナナンダ

0

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

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

これにより、上記のパターンに一致するプロセスが強制終了され、平均process1abc process2def process3ghiも強制終了されることに注意してください。


-1

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

覚えやすいほどシンプルで、私にとってはうまく機能しました。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.