我正在寻找一种基于stdout启动和停止java进程的干净方法。基本上我想通过Bash中的for循环来启动带有输入变量的java命令,监视stdout以获取特定字符串“Results:”然后杀死相同的进程,然后进入下一个进程,启动一个新的java进程并且继续进行。
我曾尝试过与coproc合作,但未能按预期接近工作。
答案 0 :(得分:1)
我会使用screen
。它适用于我的大多数脚本:
启动名为 myjava 命令的会话
screen -dmS myjava sh -c "/path/to/script.name parameters > /tmp/outfile"
这里你想用bash监视 / tmp / outfile ...(tail -f或者什么)
并使用
杀死你的会话 myjavascreen -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
时自行退出,您只需将输出传递给grep
并grep 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
自然退出。