我想生成两个子进程,但要等到第一个进程执行到某个点(可以通过检查 stdout 来确定)之后再生成第二个进程。我不确定哪些 unix 命令可以实现这一点,而且由于 unix 命令名称简洁且有时含糊不清,我很难通过 google 找到任何信息。
我并不是在寻求针对我试图解决的特定问题的解决方案(尽管任何额外的指示都会受到赞赏),我主要关心的是知道我想要查找和学习使用哪些 unix 命令。
答案1
您可以xargs
为此使用实用程序。它可以为 stdin 上的每一行运行一个命令,因此我们只需确保xargs
在启动命令时在 stdin 上获取一行作为输入,这可以通过以下方式实现grep
:
proc1 | grep --max-count=1 "${targetString}" | xargs --max-lines=1 --no-run-if-empty --replace -- proc2
参数--max-count=1
和--max-lines=1
确保仅在第一次输出时启动一次--no-run-if-empty
,并且永远不会输出。避免将输入行附加到其命令行。proc2
proc1
${targetString}
proc1
${targetString}
--replace
xargs
我使用以下命令行来测试它:
(echo Start >&2; sleep 3 ; echo Trigger; sleep 3; echo End >&2) | grep --max-count=1 Trigger | xargs --max-lines=1 --no-run-if-empty --replace -- echo "Triggered"
答案2
我不确定是否有一个优雅的命令/答案来回答你提出的问题(即在执行中达到某个点) - 但有一些工具/技术可用于解决问题,可能涉及下列中的 1 个以上,也许还有其他我还不知道的事情:
- 后台进程(&)
- 条件执行(&& 和 ||)
- 睡觉
- 等待(我希望这将特别有用 - 如果你在后台启动多个作业,它将等待所有作业完成)
- 命名管道(可以提供进程间通信的机制)。
- inodenotify等待
编写和检查锁文件也是常见的做法(专业提示 - 如果您可以控制环境,请写入 ramdisk 而不是 /tmp - 在许多发行版中这是 /dev/shm)。
答案3
这只是一个想法,但让第一个进程将其输出通过管道传输到 grep。让 grep 将其输出通过管道传输到读取行循环,并将每一行与您要查找的内容进行比较。找到后,执行 proc2。
#!/bin/bash
targetString="line you are looking for"
proc1 | grep "${targetString}" |
while read line
do
if [ "$line" = "${targetString}" ]; then
proc2
fi
done
如果“执行中的某一点”可以通过 来确定stdout
,那么接下来呢?
proc1 | grep "stdout trigger string" && proc2
&&
应在grep
返回时触发0
,只有当它找到匹配项时才会触发。