簡體   English   中英

在Bash腳本中啟動和停止過程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM