bashとregexを使用して1行でプロセスを見つけて強制終了します


650

プログラミング中にプロセスを強制終了する必要があることがよくあります。

私が今それをしている方法は:

[~]$ 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>

3
私を信じてください!: 'D選択した最初の回答は、回答で言った解決策よりもはるかに複雑です。私はむしろあなたのやり方を選びたいです。
Santosh Kumar

:プロセスが存在するかどうかを確認するための最良の方法stackoverflow.com/questions/3043978/...
トレバー・ボイド・スミス

回答:


1400

では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、あなたが取得する傾向がある2つのでのプロセスをsleep、それにsleep 3600してgrep sleep(彼らは両方持っているので、sleepそれはロケット科学ではありません、彼らに)。

ただし、でps -ef | grep '[s]leep'プロセスを作成せずsleep、代わりにを作成してgrep '[s]leep'、ここにトリッキーなビットを示します。grep正規表現「文字クラス[s]s)からの任意の文字とそれに続く」を探しているため、はそれを見つけませんleep

言い換えれば、それは探してsleepいますが、grepプロセスにはgrep '[s]leep'ありませんsleep

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

  • 追加するよりも1つ少ないプロセス| grep -v grepです。そして
  • エレガントこっそり、珍しい組み合わせです:-)

2
@paxdiablo、そのためのリンクを提供できますか?なぜ機能するのか困惑しています。
グレン・ジャックマン、

58
awk- ps auxのみを使用できますawk '/ [b] eam / {print $ 2}'grepは不要
Yola

20
pgrepまたはpkillのみを使用する方がよい
NGix

2
小さな問題が1つあります。プロセスがすでに終了している場合、この行はkill標準出力で表示されますkill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Lionel Chan

5
代わりにgrep '[p]ython csp_build.py'次のものも使用できますkill $(ps aux | grep 'python csp_build.py' | grep -v grep | awk '{print $2}')grep -v一致しない行を返します。
usandfriends 2015年

138

スキルがあれば

pkill -f csp_build.py

(完全な引数リストの代わりに)プロセス名に対してのみgrepを実行する場合は、オフのままにし-fます。


1
これをテストしても何も起こりませんでした。
Orjanp 2010

8
最初にpgrepを使用して、正しいプロセスをgrepしたことを確認します。次に、正しいパターンで再度pkillを使用します。
ghostdog74

18
+1。pgrepそしてpkill、プロセスを正しく指定するように注意する限り、動作します。デフォルトでは、プロセス名のみが一致します。この場合、ほぼ間違いなく単なる「python」です。pgrep -f "python csp_build.py"コマンド全体と一致させるために使用します。
mr.spuratic 2013年

3
強制的に殺す必要があるかもしれませんpkill -9 -f csp_build.py
studgeek

1
これは本当に受け入れられ、トップ投票の答えになるはずです。すべての他の気の利いたこれらの他のものは、やや不必要です。このページを見つけた人は、最初の答えを超えて読んでほしい。
Jason C

89

一発ギャグ:

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

  • 列2を印刷します。 awk '{print $2}'
  • sudo オプションです
  • ファイル名を指定して実行kill -9 5124kill -9 5373など(キル-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. キーワード
    • K ills A llこのキーワードを持つプロセス
    • 使用方法は、例えば:ka csp_buildka pythonなど
    • オプションのキルレベル(例: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"
}

注意 -新しい関数をロードするためにbashシェル(ターミナル)を再起動することを忘れないでください。またはsource ~/.bash_profile、現在のシェルで実行して、新しい関数をインポートします(これが私の好みです)。
a20 2017年

ここでの他の多くの回答と同様に、これはの無用な使用に大きな影響を与えますgrep。次のようにgrep x | awk '{ y }'置き換えると、通常、見た目がよくなり、多くの場合より堅牢になりますawk '/x/ { y }'
tripleee

1
@tripleeeあなたがリンクしているウェブサイトはあなたのものですよね?さまざまなコメントセクションにリンクしています。あなたはSEOを構築しようとしていますか?
a20

いいえ、SEOには関心がありません。意識を高めたいと思っています。
tripleee 2017年

1
..あたかもそれが確立されたオーソリティサイトであるかのようにあなたのウェブサイトにリンクすることによって。いいね。また、grepはより高速です。
a20


15

使ってみてください

ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill

それを少し変更する必要がありました。これはうまくいきました。ありがとう。:) ps aux | grep 'python csp_build.py' | 頭-1 | カット-d "" -f 5 | xargs kill
Orjanp 2010

3
ps aux | grep 'python csp_build.py' | awk '{print $2}' | xargs kill私のために働いた。thanx
Rasika Perera、

覚えておいて、子供たち、Awkはできるすべてのgrepことを行うことができ、そのほとんどは単純かつエレガントです。のささいなケースgrep x y | awk '{ z }'は常によりよく書かれていますawk '/x/ { z }' y-の役に立たない使用grepも参照してください。
Tripleee 2017年

12

あなたはpkill '^python*'正規表現のプロセスを殺すためにのみ使用できます。

killする前にkillしたり見つけたりするものを確認したい場合はpgrep -l '^python*'、where -lを使用してプロセスの名前も出力します。を使用したくない場合は、次のように使用 pkillします。

pgrep '^python*' | xargs kill


8

pgrepを使用-多くのプラットフォームで利用可能:

kill -9 `pgrep -f cps_build`

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


2
あなたが持っているならpgrep、あなたも持っていpkillます。いつものように、理由がわからない(デフォルト)か、機能しない場合をkill -9除いて、使用しないでください。kill -15kill -2
tripleee

これは@nathanaelの回答のより悪い言い換えのように見え-9ます。これは、誤った指示を省略し、適切な最新のコマンド置換構文を使用しています。代わりに賛成してください。もちろん、pkill答えはまだましです。
tripleee

@tripleeeこの場合、kill -9はまさに私が欲しいものです-極端な偏見ですべての犯罪者を終了させます。さらに、私は何年も問題なくkill -9を使用してきました。私の意見では、常に純粋主義者のキャンプと現実主義者のキャンプがあり、私は後者に属しています(この問題に関して)。
a20

「理由が分からない限り」は見逃しましたか?私は物事を成し遂げるためにすべてですが、これは-9実際に何が意味するのか理解するまで、足で自分を撃つ一般的な方法の1つです。
トリプリー

@tripleeeこんにちはTripleee、私は最近あなたが正しいことを発見しました、kill -15はアプリが自分自身を優雅に殺す機会を与えるのでより良い選択です。私はそれに応じてコードを変更しました:stackoverflow.com/a/30486159/163382
a20

7

これはpidのみを返します

pgrep -f 'process_name'

したがって、1行でプロセスを強制終了するには、次のようにします。

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およびでのシグナルとpgrepに関する詳細情報man pgrep


5

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

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

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

しかし、よりクリーンな解決策は、pythonプロセスがそのプロセスIDを/ var / runに格納し、そのファイルを読み取って強制終了することです。


次に、プロセス5124と5373の両方を終了しませんか?これは問題ではないと思います。
Orjanp 2010

問題はないはずですが、いつでも別のgrepを追加してgrepプロセスを除外できます
。grep

少し変更されたコマンドでテストされています。ただし、プロセスを強制終了せず、kill <pid>のみを出力しました。ps auxf | grep '[p] ython csp_build.py' | awk '{print "kill" $ 2}'
Orjanp

印刷 "kill" $ 2ステートメントをシステム( "kill" $ 2)と交換する必要があるだけです。その後、動作します。:)
Orjanp 2010

5

私の仕事は、特定のディレクトリに配置された正規表現に一致するすべてを殺すことでした(セレンテストの後、すべてが停止したわけではありません)。これは私のために働きました:

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

-9オプションkillはおそらく攻撃的すぎる。リソースを解放することはできません。
Birei 2014年

いいね!複数のマッチングプロセスがあるかもしれないという事実を考慮した唯一の1つです。ちょっとしたメモ:おそらく「grep -v grep」などをパイプに追加して、grepプロセス自体がプロセスリストに表示されないようにすることができます。
ブラッドパークス

kill複数のプロセスを受け入れるため、ループは基本的に役に立たない。また、このページの他の箇所で説明されているように、プロセスがに応答しkill -9ないことがわかっている場合を除き、使用しないでくださいkill
tripleee

remove -9は大したことではないのに、なぜ反対票を投じます。答えを編集したほうがいいです。
セルジュ

5

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

kill -SIGTERM $(pgrep -i midori)


3

awk(およびps)のみを使用する方法:

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

文字列の等価性テストを使用することで、このプロセス自体の照合を防ぎます。


なぜか「python csp_build.py」にヒットしません。しかし「パイソン」だけでもヒットします。
Orjanp 2010

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

1日の制限により+1できませんが、pswith -oオプションを使用することは使用する価値があります。
P

PSは私に多くを与えません。[〜] $ ps PID TTY TIME CMD 6365 pts / 6 00:00:00 ps 29112 pts / 6 00:00:00 bash
Orjanp

3

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


1

共通のPPIDから開始された独自のプロセスを強制終了することは非常に頻繁であり、フラグに関連付けられたpkill–Pは私にとって勝者です。@ 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

psのユーザースイッチは必要ありません。

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

1

場合によっては、次のように同時にプロセスを強制終了したいです。

➜〜1000睡眠&
[1] 25410
➜〜1000睡眠&
[2] 25415
➜〜1000睡眠&
[3] 25421
➜〜pidof睡眠
25421 25415 25410
➜〜「pidofスリープ」を終了します
[2]-25415はスリープ1000を終了しました                                                             
[1]-25410はスリープ1000を終了しました
[3] + 25421はスリープ1000を終了しました

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


1

場合はpkill -f csp_build.py、プロセスを殺さないあなたが追加することができます-9無視されることはありませんキルsignallを送信します。すなわちpkill -9 -f csp_build.py


1

解決策は、正確なパターンでプロセスをフィルタリングし、pidを解析して、killプロセスを実行するための引数リストを作成することです。

ps -ef  | grep -e <serviceNameA> -e <serviceNameB> -e <serviceNameC> |
awk '{print $2}' | xargs sudo kill -9

文書からの説明

psユーティリティはヘッダー行を表示し、その後に制御端末を持つすべてのプロセスに関する情報を含む行が続きます。

-eプロセスを含む他のユーザーのプロセスに関する情報を表示します

-f uid、pid、親pid、最近のCPU使用率、プロセスの開始を表示します

grepのユーティリティの検索では、すべてのことを行を選択し、入力ファイルを与えられました

-e pattern、--regexp = pattern入力の検索中に使用されるパターンを指定します。指定されたパターンのいずれかに一致する場合、入力行が選択されます。このオプションは、複数の-eオプションを使用して複数のパターンを指定する場合、またはパターンがダッシュ( `-')で始まる場合に最も役立ちます。

xargs-引数リストを作成してユーティリティを実行する

kill-プロセスを終了またはシグナル通知する

ナンバー9シグナル-KILL(キャッチ不可、無視不可キル)

ps -ef  | grep -e node -e loggerUploadService.sh - -e applicationService.js |
awk '{print $2}' | xargs sudo kill -9

0

私はこれを使用して、スクリプトが非難され、CPUがバッシングされている場合にFirefoxを強制終了します。私はBashシェルを使用しています-OS X 10.9.3 Darwin。

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


に置き換えるgrep Firefox | awk 'NR == 1 { next } ...'awk 'NR == 1 || $11 !~ /Firefox/ { next } ...'、プロセスが節約されるだけでなく、精度も向上します。sort | uniq純粋なAwkで取り除くことも難しくありません(もちろん、これはuniq | sort間違っています-隣接していない重複はすべて見逃され、の出力を不必要にソートすることでエラーを隠しますuniq)。
tripleee

0

私はを使用していますが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」があるプロセスは強制終了しません。


1
ヤクの小屋の多くの、他の多くの再発明と同様に、これは、他の一般的なシェルスクリプトのアンチパターンの無用な使用にgrep悩まされています。
Tripleee

-1

次のコマンドが便利です。

kill $(ps -elf | grep <process_regex>| awk {'print $4'})

例えば。、 ps -elf | grep top

    0 T ubuntu    6558  6535  0  80   0 -  4001 signal 11:32 pts/1    00:00:00 top
    0 S ubuntu    6562  6535  0  80   0 -  2939 pipe_w 11:33 pts/1    00:00:00 grep --color=auto top

kill -$(ps -elf | grep top| awk {'print $4'})

    -bash: kill: (6572) - No such process
    [1]+  Killed                  top

プロセスがまだスタックしている場合は、次のように「-9」拡張を使用してhardkillを実行します。

kill -9 $(ps -elf | grep top| awk {'print $4'})

お役に立てれば幸いです...!


-1

bashですべてのプロセスを1行で見つけて強制終了します。

kill -9 $(ps -ef | grep '<exe_name>' | grep -v 'grep' | awk {'print $2'})
  • ps -ef | grep '<exe_name>'-パターンに一致する実行中のプロセスの詳細(uname、pidなど)のリストを提供します。出力リストには、grepそれを検索するこのコマンドも含まれています。殺すために、このgrepコマンドプロセスを無視する必要があります。
  • ps -ef | grep '<exec_name>' | grep -v 'grep' -別のgrepを追加する -v 'grep'すると、現在のgrepプロセスが削除されます。
  • 次に、 awk getプロセスIDのみます。
  • 次に、このコマンドを保持してcommandに$(...)渡しkill、すべてのプロセスを強制終了します。

-1

以下のコマンドを使用して、コマンドのpidをリストできます。Linuxですべてのプロセスを表示するには、topまたはそれ以上のhtopを使用してください。ここで私は名前のプロセスを殺したいと思います

ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'

そして、pidを確認します。それらは適切でなければなりません。それらを殺すにはkillコマンドを使用してください。

sudo kill -9 `ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'`

例:-は、htopプロセスリストからのものです。

sudo kill -9 `ps -ef | grep '<process>'  | grep -v grep | awk '{print $2}'`

これは私の問題を解決します。誤ってプロセスを強制終了した場合は、常にプロセスを再起動する準備をしてください。

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