1. ホーム
  2. regex

[解決済み] bashと正規表現を使って1行でプロセスを検索してkillする

2022-03-14 16:02:56

質問

プログラミング中にプロセスを停止させる必要があることがよくあります。

私が今やっている方法は

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

解決方法は?

bash ができるはずです。

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 & に続いて ps -ef | grep sleep を取得する傾向があります。 プロセスで sleep が入っている場合、その sleep 3600grep 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 そして
  • エレガント そして この組み合わせは珍しいですね。)