根據特定輸出終止進程

根據特定輸出終止進程

如何根據進程的特定輸出終止該進程?例如,執行 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 會話,請使用命名會話。

相關內容