特定の部分的な名前を持つすべてのプロセスを強制終了する方法は?[閉まっている]


623

取得したすべてのプロセスを強制終了したい:

ps aux | grep my_pattern

どうやってするの?

これは動作しません:

pkill my_pattern

11
my_pattern、単に名前のストリング、またはそれは任意の正規表現の特殊文字が含まれているのですか?
Sven Marnach、2012年

回答:


1318

pkill -fコマンドラインの任意の部分のパターンに一致するを使用します

pkill -f my_pattern

7
@ジャヤン:殺害においても無差別です。意外と扱いが簡単です...
thkala 2012年

1
@ジャヤン:あなたは私を納得させるつもりはない:-)。私は、使用を主張するサードパーティのスクリプトに何度も焦らされてきましpkillた。最もよくある間違いは、各バイナリのインスタンスは常に1つしか存在できないという仮定でした。
thkala 2012年

4
私のように、この答えを見つけたすべてのMacユーザーにとって、Macと同等のものはkillall -m my_patternです。
Zev Eisenberg 2014

1
強制終了されない多くのハングプロセスがある場合、pkill -f -9を使用して無慈悲に
強制終了

18
pgrep最初にを使用して、何を殺すか確認することをお勧めします。を使用pgrep -lして、プロセス名pgrep -aを表示したり、完全なコマンドラインを表示したりできます。pkillと同じフラグを使用します。したがって、この場合はを使用できますpgrep -fa my_pattern
studgeek

158

文字列「myProcessName」に一致するすべてのプロセスを強制終了します。

ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9

ソース:http : //www.commandlinefu.com/commands/view/1138/ps-ef-grep-process-grep-v-grep-awk-print-2-xargs-kill-9

このコードは何をしていますか?

ps -efこのユーザーには見えコンピュータ上でプロセスIDのリストを生成します。pipe grepは、その文字列を含む行をフィルタリングします。grep -v grepgrepをを行うプロセス自体に一致していないと言います。パイプのawk印刷では、デフォルトの区切り文字の空白で行を分割し、プロセスIDである2番目の列にフィルターをかけます。パイプxargsは、すべてのpidを送信する新しいプロセスを起動しますkill -9すべてを終了します。

上記のコードは、いくつかの理由で、悪い、危険、醜い、ハックです。

  1. 強制終了されるコードがデータベース操作または安全なトランザクションを低確率の競合状態で実行している場合、時間の一部の割合で、そのトランザクションのアトミック性が破壊され、未定義の動作が発生します。kill -9は囚人を連れて行かない。コードがこれに敏感な場合はxargs kill、正常なシャットダウンを要求する送信済みフラグでパーツを置き換えてみてください。その要求が拒否された場合にのみ、最後の手段としてkill -9

  2. オペレーティングシステムを誤って終了したり、無関係なプロセスで未定義の動作を引き起こしたりして、ps -ef存在する可能性のあるすべてのプロセスがリストされ、システム全体が不安定になる可能性があります。プロセス名、またはreadとexecute kill -9の間の時間に、プロセスIDが別の何かに変更され、意図しないいくつかのランダムプロセスが誤って終了しました。

しかし、非常にユニークな名前でそれらのリスクと制御を理解し、いくつかのトランザクションの削除またはデータの偶発的な破損に問題がなければ、99.9%の時間で問題ありません。問題がある場合は、コンピューターを再起動し、プロセスの競合がないことを確認します。これは、テクニカルサポートスクリプトが「コンピュータを再起動してみましたか」というレベル5のミームになっているためです。


15
名前に一致するプロセスが見つからない場合、エラーがスローされます。あなたは使用することをお勧めしますps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9引数を指定しない場合は、コマンドを実行していないxargsのを持っています。
エピジェネ2016年

2
わずかな変更ですが、おそらくプロセス名を引用する方が良いでしょう。 ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9 引用符がないと、最初の実行でバックグラウンドプロセスの1つだけが強制終了されました。もう一度実行すると、残りが殺されました。
Ali Haider

-rオプションはOS Xには存在しないので、そうです。
Danijel

52

プロセスの選択にさらに柔軟性が必要な場合は、

for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do 
  kill -9 $KILLPID;
done

grep -eなどを使用できます。


4
-1ループは必要ありません。必要なだけですkill -9 `ps ax | awk '[m]y_pattern { print $1 }'`(リファクタリングにも注意してください。@ synthesizerpatelの回答に関する私のコメントも参照してください)。
tripleee

11
あなたのdownvoteと@tripleeeない問題が、あなたはやる OQだったことを認識し、「私は私がで取得したすべてのプロセスを殺したい:psの補助| grepをmy_pattern」私はdutyfully受け入れ、。
Eugen Rieck

Killはすべてのプロセスを一度に終了します。そのためのループは必要ありません。psが3つのプロセス123、234、および345を返す場合は、kill 123 234 345同じように、rmまたはcat複数のファイル引数を使用できます。
tripleee

@tripleee私は削除しますgrep
Eugen Rieck 2012

for KILLPID in ps ax | grep 'puma' | grep -v 'grep' | awk '{print $ 1;}' ; do kill -9 $KILLPID; doneはgrepを削除します
Justin E

18

次のコマンドを使用してプロセスを一覧表示できます

ps aux | grep -c myProcessName 

そのプロセスの数を確認する必要がある場合は、実行します

ps aux | grep -c myProcessName |grep -v grep 

その後、あなたは使用してプロセスを殺すことができます

kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }') 

次のコマンドを使用して、プロセスps aux |を一覧表示できます。そのプロセスのカウントを確認する必要がある場合は、grep -c myProcessNameを実行してから、ps aux | grep -c myProcessName | grep -v grepその後、kill -9を使用してプロセスを終了できます$(ps aux | grep -e myProcessName | awk '{print $ 2}')
Nived Thanima

13

また、使用できますkillall -r my_pattern-rプロセス名パターンを拡張正規表現として解釈します。

killall -r my_pattern

8

pkill -f PATTERN少し危険すぎると判断した場合は、killするPATTERNに一致するプロセスの中からどのプロセスを選択するかを尋ねる bashスクリプトをezkillで作成しました。



4

プロセスIDの検索に頭を悩ませたくない場合は、regexpを使用して名前でプロセスを強制終了します。たとえば、次のコードでchromeをkillすると、トリックが実行されます。

killall -r --regexp chrome


1
必要なのは-r または のみで--regexp、それぞれ、shortおよびGNU longオプションです。
BigSmoke

3

次のコマンドを使用して、次のことができます。

ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9

または

ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9

わたしにはできる。


1
StackOverflowへようこそ。コード行には4スペースまたはタブインデントを使用して、コードブロックとしてフォーマットされるようにしてください。よろしく
YakovL 2017


2

サポートしていないサーバーでそれを行うための最良の方法を見つけました pkill

kill -9 $(ps ax | grep My_pattern| fgrep -v grep | awk '{ print $1 }')

ループする必要はありません。


1

それは使用するのが最善と最も安全だpgrep -fkill、あるいは単にpkill -fgrepINGのpsの出力が間違って行くことができます。

パターントリックをps | grep追加| grep -vまたは使用してgrep行をフィルターで除外する必要があるとは異なりpgrep、仕様で選択するだけではありません。

また、あなたのパターンはに表示されるはずpsUID/ USERSDATE/ STARTまたは他の列、あなたは、出力に不要なプロセスを取得し、それらを殺しますpgrep+pkillこの欠陥に悩まされません。

また、私の正規表現ではkillall -r/ -regexpが機能しないこともわかりました。

pkill -f "^python3 path/to/my_script$"

man pkill


0

私はオイゲンリーエックの答えを受け取り、それを使って作業しました。私のコードは以下を追加します:

  1. ps ax grepを含むので、私はそれを除外しました grep -Eiv 'grep'
  2. いくつかのifsとechosを追加して、人間が読めるようにしました。

私はそれという名前のファイルを作成しましたkillserver、ここにそれは行きます:

#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
  if [ ! -z $KILLPID ];then
    kill -9 $KILLPID
    echo "Killed PID ${KILLPID}"
    KILLED=yes
  fi
done

if [ -z $KILLED ];then
    echo "Didn't kill anything"
fi

結果

  myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
  myapp git:(master) bash killserver
Didn't kill anything

0

これが方法です:

kill -9 $(pgrep -d' ' -f chrome)

3
このコードは質問に答えることがありますが、問題を解決する方法や理由に関する追加のコンテキストを提供すると、回答の長期的な価値が向上します。
イゴールF.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.