1

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

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

4

3 回答 3

1
于 2017-02-07T03:12:44.637 回答
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
于 2017-02-06T17:31:05.520 回答
0

假设您的 Java 代码在收到 时自行退出SIGPIPE,您可以将输出通过管道传输到grep并在第一次匹配后让grep exit as soon as it sees a match. Assuming you are using a version ofgrep that supports the-m option (GNU and BSDgrep both do), you can havegrep` 退出:

java ... | grep -m 1 'Results:'

一个小问题:由于缓冲,您的程序可能会在实际看到“结果”行java之前继续运行一段时间。grep


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

java ... | grep 'Results:' | tee | grep -q '.*'

这遇到了同样的缓冲问题,但被放大了:不仅第一个grep必须等​​待才能真正接收到“结果”行,而且tee可能同样需要等待才能最终获得相同的行。此外,如果行太小,第一个grep可能永远不会产生更多输出,需要您等待java自然退出,然后才能tee看到任何输入。

于 2017-02-06T18:02:57.903 回答