在Bash脚本中启动和停止进程

时间:2017-02-06 17:24:02

标签: bash pid coproc

我正在寻找一种基于stdout启动和停止java进程的干净方法。基本上我想通过Bash中的for循环来启动带有输入变量的java命令,监视stdout以获取特定字符串“Results:”然后杀死相同的进程,然后进入下一个进程,启动一个新的java进程并且继续进行。

我曾尝试过与coproc合作,但未能按预期接近工作。

3 个答案:

答案 0 :(得分:1)

我会使用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

答案 1 :(得分:1)

你可以这样使用coproc

coproc java …
grep -q -m1 'Results:' <&$COPROC && kill $COPROC_PID 

这将从java输出中读取grep并在看到匹配的行时立即将其终止。

如果要查看java命令的输出而不是静默执行此操作,请使用tee打印输出并将其发送到grep … && kill …组。

coproc java …
tee <&$COPROC >(grep -q -m1 'Results:' && kill $COPROC_PID)

答案 2 :(得分:0)

假设您的Java代码在收到SIGPIPE时自行退出,您只需将输出传递给grepgrep exit as soon as it sees a match. Assuming you are using a version of grep that supports the - m {{ 1}} grep option (GNU and BSD grep`在第一场比赛后退出:

both do), you can have

轻微一点:由于缓冲,java ... | grep -m 1 'Results:' 程序在java实际看到“结果”行之前可能会持续运行很长时间。

仅使用标准grep,您可以使用grep显示输出并在找到任何匹配后退出。

tee

这会遇到相同的缓冲问题,但会被放大:不仅第一个java ... | grep 'Results:' | tee | grep -q '.*' 必须等到它实际收到“结果”行之前,但grep可能同样需要等到它最终获得相同的路线。此外,如果该行太小,则第一个tee可能永远不会产生更多输出,要求您在grep看到任何输入之前等待java自然退出。