如何解决无法终止来自不同进程的命令
我有一个无限期运行的命令“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 举报,一经查实,本站将立刻删除。