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