プロセスからの特定の出力時にプロセスを終了するにはどうすればよいですか? たとえば、 で Java プログラムを実行しているjava -jar xyz.jar
ときに、stdout に「ポート 8000 でサーバーを起動しました」という行が表示されたらプロセスを終了したいとします。
答え1
grep -m1
それがうまくいかない場合は、次のスクリプトで実現できます。
#!/bin/bash
java -jar xyz.jar &> "/tmp/yourscriptlog.txt" &
processnumber=$!
tail -F "/tmp/yourscriptlog.txt" | awk '/Started server on port 8000/ { system("kill '$processnumber'") }'
基本的に、このスクリプトは、stdout
コマンドを使用して Java コードの をファイルにリダイレクトします&> "/tmp/yourscriptlog.txt"
。最初の行の最後の は&
、コードを独立したプロセスとして実行し、次の行には でこのプロセスの番号を指定します$!
。プロセス番号と のログ ファイルがあれば、tail
目的の行が印刷されたときに最終的にプロセスを強制終了できます。
答え2
java -jar xyz.jar | grep -m1 "Started server on port 8000"
答え3
私の場合のように、スクリプトが単純にバックグラウンドに追いやられないような、より複雑な状況に合わせて、@Rafael の回答を調整しました。
最初のセッションを開きtmux
、コマンドを入力し(tee
出力をライブで表示するにはリダイレクトの代わりに使用)、Ctrl-B D でデタッチします。
java -jar xyz.jar &> '/var/log/myscript.log'
別の tmux セッションで、終了を処理します。
tail -F '/var/log/myscript.log' | awk '/Started server on port 8000/ { system("tmux kill-session -t 0") }'
すでに他の tmux セッションが実行されている場合は、名前付きセッションを使用します。