[英]Start and Stop Process in Bash Script
我正在尋找一種干凈的方法來啟動和停止基於stdout的Java進程。 基本上,我想在Bash中進行一個for循環,該循環使用輸入變量啟動一個Java命令,監視stdout中是否存在特定字符串“ Results:”,然后殺死該相同的進程,然后轉到下一個進程,啟動一個新的Java進程,並繼續。
我曾嘗試與coproc合作,但未能如願以償。
我會用screen
。 它適用於我的大多數腳本:
啟動名為myjava命令的會話
screen -dmS myjava sh -c "/path/to/script.name parameters > /tmp/outfile"
在這里您想用bash監視/ tmp / outfile ...(tail -f之類的東西)
並殺死您的會話myjava
screen -X -S myjava kill
您可以像這樣使用coproc
:
coproc java …
grep -q -m1 'Results:' <&$COPROC && kill $COPROC_PID
這將使grep
從java輸出中讀取並在看到匹配的行后立即將其殺死。
如果您想查看java命令的輸出而不是靜靜地執行此操作,請使用tee
來打印輸出並將其發送到grep … && kill …
組。
coproc java …
tee <&$COPROC >(grep -q -m1 'Results:' && kill $COPROC_PID)
假設您的Java代碼在收到SIGPIPE
時僅自行退出,則可以將輸出通過管道傳遞到grep
並在grep exit as soon as it sees a match. Assuming you are using a version of
grep exit as soon as it sees a match. Assuming you are using a version of
that supports the
-m option (GNU and BSD
grep exit as soon as it sees a match. Assuming you are using a version of
grep grep exit as soon as it sees a match. Assuming you are using a version of
option (GNU and BSD
grep both do), you can have
在第一次匹配后退出grep`:
java ... | grep -m 1 'Results:'
一個小問題:由於緩沖,您的java
程序可能會繼續運行很長時間,直到grep
實際看到“ Results”行。
僅使用標准grep
,可以使用tee
在找到任何匹配項后顯示輸出和退出。
java ... | grep 'Results:' | tee | grep -q '.*'
這會遇到相同的緩沖問題,但會被放大:不僅第一個grep
必須等待才能真正接收到“ Results”行,而且類似地, tee
可能需要等待才能最終到達同一行。 此外,如果行太小,則第一個grep
可能再也不會產生任何輸出,這就要求您在tee
看到任何輸入之前等待java
自然退出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.