web-dev-qa-db-ja.com

Bashと正規表現を使って1行でプロセスを見つけて強制終了する

私はしばしばプログラミング中にプロセスを強制終了する必要があります。

私は今それをする方法は次のとおりです。

[~]$ ps aux | grep 'python csp_build.py'
user    5124  1.0  0.3 214588 13852 pts/4    Sl+  11:19   0:00 python csp_build.py
user    5373  0.0  0.0   8096   960 pts/6    S+   11:20   0:00 grep python csp_build.py
[~]$ kill 5124

どうすればプロセスIDを自動的に抽出して同じ行で強制終了することができますか?

このような:

[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>
553
Orjanp

bashでは、次のことができるはずです。

kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')

動作の詳細は次のとおりです。

  • psは、すべてのプロセスのリストを提供します。
  • grepフィルターは、検索文字列に基づいて、[p]が実際のgrepプロセス自体の取得を停止するためのトリックです。
  • awkは、PIDである各行の2番目のフィールドを提供します。
  • $(x)構文は、xを実行し、その出力を取得してコマンドラインに配置することを意味します。上記のコンストラクト内のpsパイプラインの出力はプロセスIDのリストなので、kill 1234 1122 7654のようなコマンドになります。

動作中のスクリプトを次に示します。

pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+  Terminated              sleep 3600
[1]   Terminated              sleep 3600
[2]   Terminated              sleep 3600
[3]-  Terminated              sleep 3600
[4]+  Terminated              sleep 3600

そして、あなたはそれがすべての枕木を終わらせるのを見ることができます。


grep '[p]ython csp_build.py'ビットをもう少し詳しく説明します。

sleep 3600 &に続いてps -ef | grep sleepを実行すると、twoプロセスにsleepsleep 3600およびgrep sleepが含まれる傾向があります(両方にsleepが含まれているため、そうではありません)ロケット科学)。

ただし、ps -ef | grep '[s]leep'sleepを含むプロセスを作成せず、代わりにgrep '[s]leep'を作成します。ここで注意が必要なのは、grepが「すべての文字からの正規表現を探しているため、文字クラス[s]s)の後にleepが続きます。

つまり、sleepを探していますが、grepプロセスはgrep '[s]leep'であり、sleepが含まれていません。

私がこれを見せられたとき(SOの誰かによって)、私はすぐにそれを使い始めました

  • | grep -v grepを追加するよりも1つ少ないプロセスです。そして
  • それはエレガントですand卑劣な、まれな組み合わせ:-)
1270
paxdiablo

あなたがpkillを持っているなら、

pkill -f csp_build.py

(完全な引数リストではなく)プロセス名に対してのみgrepしたい場合は、-fを省略してください。

116
ghostdog74

ワンライナー:

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

  • 2列目をプリントアウトする:awk '{print $2}'
  • Sudoはオプションです
  • kill -9 5124kill -9 5373などを実行します(kill -15はより優雅ですが、少し遅くなります)。

ボーナス:

私は私の.bash_profileで定義された2つのショートカット関数も持っています(〜/ .bash_profileはosx用です、あなたはあなたの* nixマシンで何がうまくいくかを見なければなりません)。

  1. p キーワード
    • キーワードを含むすべての _ p _ rocessesを一覧表示します。
    • 使用例:p csp_buildp pythonなど

bash_profileコード:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}
  1. ka キーワード
    • _ k _ ills _ a _ llこのキーワードを持つプロセス
    • 使用例:ka csp_buildka pythonなど
    • オプションのkillレベル(例:ka csp_build 15ka python 9

bash_profileコード:

# KILL ALL
function ka(){

    cnt=$( p $1 | wc -l)  # total count of processes found
    klevel=${2:-15}       # kill level, defaults to 15 if argument 2 is empty

    echo -e "\nSearching for '$1' -- Found" $cnt "Running Processes .. "
    p $1

    echo -e '\nTerminating' $cnt 'processes .. '

    ps aux  |  grep -i $1 |  grep -v grep   | awk '{print $2}' | xargs Sudo kill -klevel
    echo -e "Done!\n"

    echo "Running search again:"
    p "$1"
    echo -e "\n"
}
76
a20

使ってみる

ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill
14
Rahul
killall -r regexp

-r, --regexp

プロセス名パターンを拡張正規表現として解釈します。

13
Miron Yanovskiy

正規表現プロセスの強制終了にはpkill '^python*'のみを使用できます。

あなたがあなたがあなたが殺すか殺す前に見つけるつもりを見たいならばちょうどpgrep -l '^python*'を使用してください-lはプロセスの名前も出力します。 pkillを使用したくない場合は、単に次のように使用します。

pgrep '^python*' | xargs kill

9
NGix

Pgrepを使う - 多くのプラットフォームで利用可能です。

kill -9 `pgrep -f cps_build`

pgrep -fは、 "cps_build"と一致するすべてのPIDを返します。

6
user3115782

キーワードmidoriでプロセスを強制終了するには、例えば:

kill -SIGTERM $(pgrep -i midori)

5
l3v1ath4n

あなたはawkとbackticsでそれをすることができます

ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`

awkの$ 2は2列目を印刷し、backticsは印刷されたステートメントを実行します。

しかし、もっときれいな解決策は、pythonプロセスがそのプロセスIDを/ var/runに保存することです。そうすれば、単純にそのファイルを読んでそれをkillすることができます。

5

私の仕事は、特定のディレクトリに置かれている正規表現にマッチするものすべてを削除することでした(Seleniumのテストの結果、すべてが停止したわけではありません)。これは私のために働いた:

for i in `ps aux | egrep "firefox|chrome|Selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done
4
Serge

awk(およびps)のみを使用するメソッド

ps aux | awk '$11" "$12 == "python csp_build.py" { system("kill " $2) }'

文字列等価性テストを使用することで、このプロセス自体のマッチングを妨げます。

3
schot
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15
3
Vijay

Pkillに-fを与える

pkill -f /usr/local/bin/fritzcap.py

.pyファイルの正確なパスは

# ps ax | grep fritzcap.py
 3076 pts/1    Sl     0:00 python -u /usr/local/bin/fritzcap.py -c -d -m
2
Robert1968

私はこのようなものを使い始めました:

kill $(pgrep 'python csp_build.py')
2
Nathanael

いくつかのケースでは、私はこのようにプロセスを同時にkillしたいと思います。

➜〜1000と
 [1] 25410 
 1000〜1000と
 [2] 25415 [
スリー〜1000と
 [3] ] 25421 
 Pidof sleep 
 25421 25415 25410 
 D [pidof sleep] [2]  -  25415スリープを終了しました1000 
 [] 1]  -  25410:スリープ終了1000 
 [3] + 25421:スリープ終了1000

しかし、私はそれがあなたの場合には少し不適切であると思います(バックグラウンドでpython a、python b、python x ...を実行しているかもしれません)。

1
kashu.org

共通の _ ppid _ から始めた私たち自身のプロセスを殺すことは非常に頻繁にあります、–Pフラグに関連する pkill は私にとって勝者です。 @ ghostdog74の使用例

# sleep 30 &                                                                                                      
[1] 68849
# sleep 30 &
[2] 68879
# sleep 30 &
[3] 68897
# sleep 30 &
[4] 68900
# pkill -P $$                                                                                                         
[1]   Terminated              sleep 30
[2]   Terminated              sleep 30
[3]-  Terminated              sleep 30
[4]+  Terminated              sleep 30
1

これはpidのみを返します

pgrep -f 'process_name'

だから一行で任意のプロセスを殺すために:

kill -9 $(pgrep -f 'process_name')

あるいは、プロセスの正確な名前がわかっていれば、pidofを試すこともできます。

kill -9 $(pidof 'process_name')

しかし、あなたがプロセスの正確な名前を知らないならば、pgrepはより良いでしょう。

同じ名前で複数のプロセスが実行されていて、最初のプロセスを強制終了したい場合は、次のようにします。

kill -9 $(pgrep -f 'process_name' | head -1)

また、大文字と小文字の区別が心配な場合は、grepのように-iオプションを追加できます。例えば:

kill -9 $(pgrep -fi chrome)

man 7 signalまたはman signalおよびman pgrepでのシグナルおよびpgrepに関する詳細情報

1
Rakib Fiha

あなたはpsのためにユーザースイッチを必要としません。

kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'`
1
Alex V

gkill processnameを使用します。ここで、gkillは次のスクリプトです。

cnt=`ps aux|grep $1| grep -v "grep" -c`
if [ "$cnt" -gt 0 ]
then
    echo "Found $cnt processes - killing them"
    ps aux|grep $1| grep -v "grep"| awk '{print $2}'| xargs kill
else
    echo "No processes found"
fi

注:コマンドラインに "grep"が含まれているプロセスは強制終了されません。

0
Kostyantyn

私はこれを使用して、スクリプトが暴走してcpu bashingしているときにFirefoxを殺します:) 'Firefox'をあなたが死にたいアプリケーションに置き換えます。私はBash Shellを使っています - OS X 10.9.3 Darwin。

kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)

0
mrhassell