我正在寻找一种干净的方法来启动和停止基于标准输出的 java 进程。基本上我想通过 Bash 中的一个 for 循环,它启动一个带有输入变量的 java 命令,监视 stdout 中的特定字符串“结果:”,然后杀死同一个进程,然后进入下一个进程,启动一个新的 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
假设您的 Java 代码在收到 时自行退出SIGPIPE
,您可以将输出通过管道传输到grep
并在第一次匹配后让grep exit as soon as it sees a match. Assuming you are using a version of
grep that supports the
-m option (GNU and BSD
grep both do), you can have
grep` 退出:
java ... | grep -m 1 'Results:'
一个小问题:由于缓冲,您的程序可能会在实际看到“结果”行java
之前继续运行一段时间。grep
仅使用标准grep
,您可以tee
在找到任何匹配项后显示输出和退出。
java ... | grep 'Results:' | tee | grep -q '.*'
这遇到了同样的缓冲问题,但被放大了:不仅第一个grep
必须等待才能真正接收到“结果”行,而且tee
可能同样需要等待才能最终获得相同的行。此外,如果行太小,第一个grep
可能永远不会产生更多输出,需要您等待java
自然退出,然后才能tee
看到任何输入。