プログラミング中にプロセスを強制終了する必要があることがよくあります。
私が今やっている方法は次のとおりです。
[~]$ 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>
ベストアンサー1
ではbash
、質問(1)に記載されている基本的なツールのみを使用して、次のことができるはずです。
kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')
動作の詳細は次のとおりです。
ps
すべてのプロセスのリストが表示されます。grep
検索文字列に基づくフィルターは、実際[p]
のプロセス自体を拾うことを阻止するためのトリックですgrep
。awk
各行の 2 番目のフィールド (PID) が提供されます。- 構文は、
$(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 &
の後に を実行すると、と を含む2 つのプロセスps -ef | grep sleep
が生成されます(どちらにも が含まれているため、これは難しいことではありません)。sleep
sleep 3600
grep sleep
sleep
ただし、は を含むプロセスps -ef | grep '[s]leep'
を作成せず、代わりに コマンドを含むプロセスを作成します。ここで注意すべき点があります。 は、正規表現「文字クラス(基本的には) の任意の文字に続く 」を探しているため、そのプロセスを見つけられません。grep
sleep
grep '[s]leep'
grep
[s]
s
leep
つまり、sleep
grep プロセスはgrep '[s]leep'
テキストがsleep
含まれていないものを探しています。
これを(SOの誰かから)見せてもらったとき、すぐに使い始めました。
- 追加するよりもプロセスが1つ少なくなります
| grep -v grep
。 - エレガントでありながらもこっそりしていて、珍しい組み合わせですね :-)
(1)これらの基本的なツールの使用に限定されない場合は、特定の基準に基づいてプロセスを見つける便利なコマンドがあります(もちろんpgrep
、システムで使用できることを前提としています)。
たとえば、 を使用してpgrep sleep
すべてのコマンドのプロセス ID を出力できますsleep
(デフォルトでは、プロセス名と一致します)。 に示すように、コマンド ライン全体を一致させたい場合はps
、 のように実行できますpgrep -f 'sleep 9999'
。
ちなみに、 を実行するとそれ自体はリストに表示されないためpgrep pgrep
、この場合は上記のような巧妙なフィルター方法は必要ありません。
を使用して完全なプロセス名を表示することで、プロセスが関心のあるプロセスであることを確認できます。または-a
を使用して、スコープを自分のプロセス (または特定のユーザー セット) に制限することもできます。その他のオプションについては、/のページを参照してください。-u
-U
man
pgrep
pkill
満足したら、関心のあるプロセスのみが表示されるので、pkill
同じパラメータを使用して、それらのすべてのプロセスに信号を送信できます。