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