繁体   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