微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法终止来自不同进程的命令

如何解决无法终止来自不同进程的命令

我有一个无限期运行的命令“command1”(必须用 Ctrl+c 终止),并且它以随机间隔向标准输出输出新行。我的目标是运行它并查看它是否在 10 秒内输出某个“目标”行。如果生成目标输出,则立即停止并成功,否则等待 10 秒并失败。

我想出了这个:

timeout 10 bash -c '(while read line; do [[ "$line" == "target" ]] && break; done < <(command1))'

它可以工作,但问题是当找到匹配项时,虽然 timeout 命令完成并成功返回,但 command1 将作为后台进程无限期地继续运行。当执行“break”时,我也需要它停止。如果未找到匹配项,并且超时到期,则 command1 将正确停止。

我也试过这个:

timeout 10 bash -c '(command1 | while read line; do [[ "$line" == "target" ]] && exit; done)'

这不会让任何虚假进程运行。问题是exit命令不会终止command1,因为它在一个单独的进程中,即使之前找到了目标,超时总是过期。

我正在探索一些替代选项,例如 wait -n,但同样的问题仍然存在,而且我必须使用 bash 4.2,因此 wait -n 甚至不是一个选项。

任何建议将不胜感激。

解决方法

null 没有自行终止时,您可以手动终止它。
顺便说一句:您可以使用 command1 代替 while read ...

grep

timeout 10 bash -c 'command1 | (grep -m1 -Fx "target"; pkill -P $PPID command1)' 确保只有此命令中的 -P $PPID 被终止,而不会同时在另一个 shell 中运行的其他一些 command1 被终止。

这里假设 command1 是一个单一的命令,而不是像 command1 这样的命令。对于这种情况,您可以简单地使用 (cmd1; cmd2; ...) 终止整个 bash 进程。

,

找到最适合我的情况:

timeout 10 bash -c 'grep -q -m1 "target" <(command1); pkill -P $!'

当找到目标或超时到期时,所有进程都会正常终止。如果找到,command 返回 0,如果没有找到,command 返回 124。 感谢@Socowi 提供的一些非常有用的提示,让我走上正轨。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。