bashと正規表現を使用して1行でプロセスを検索して終了する 質問する

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>

ベストアンサー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が生成されます(どちらにも が含まれているため、これは難しいことではありません)。sleepsleep 3600grep sleepsleep

ただし、は を含むプロセスps -ef | grep '[s]leep'を作成せず、代わりに コマンドを含むプロセスを作成します。ここで注意すべき点があります。 は、正規表現「文字クラス(基本的には) の任意の文字に続く 」を探しているため、そのプロセスを見つけられません。grepsleepgrep '[s]leep'grep[s]sleep

つまり、sleepgrep プロセスはgrep '[s]leep'テキストがsleep含まれていないものを探しています。

これを(SOの誰かから)見せてもらったとき、すぐに使い始めました。

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

(1)これらの基本的なツールの使用に限定されない場合は、特定の基準に基づいてプロセスを見つける便利なコマンドがありますもちろんpgrep、システムで使用できることを前提としています)。

たとえば、 を使用してpgrep sleepすべてのコマンドのプロセス ID を出力できますsleep(デフォルトでは、プロセス名と一致します)。 に示すように、コマンド ライン全体を一致させたい場合はps、 のように実行できますpgrep -f 'sleep 9999'

ちなみに、 を実行するとそれ自体はリストに表示されないためpgrep pgrep、この場合は上記のような巧妙なフィルター方法は必要ありません。

を使用して完全なプロセス名を表示することで、プロセスが関心のあるプロセスであることを確認できます。または-aを使用して、スコープを自分のプロセス (または特定のユーザー セット) に制限することもできます。その他のオプションについては、/のページを参照してください。-u-Umanpgreppkill

満足したら、関心のあるプロセスのみが表示されるので、pkill同じパラメータを使用して、それらのすべてのプロセスに信号を送信できます。

おすすめ記事