特定の出力に基づいてプロセスを終了するにはどうすればよいですか?たとえば、Javaプログラムを実行すると、java -jar xyz.jar
標準出力に「ポート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セッションが実行されている場合は、名前付きセッションを使用してください。