特定の出力に基づいてプロセスを終了

特定の出力に基づいてプロセスを終了

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

関連情報