我应该使用什么命令来连续创建两个子进程?

我应该使用什么命令来连续创建两个子进程?

我想生成两个子进程,但要等到第一个进程执行到某个点(可以通过检查 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,并且永远不会输出。避免将输入行附加到其命令行。proc2proc1${targetString}proc1${targetString}--replacexargs

我使用以下命令行来测试它:

(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 个以上,也许还有其他我还不知道的事情:

  1. 后台进程(&)
  2. 条件执行(&& 和 ||)
  3. 睡觉
  4. 等待(我希望这将特别有用 - 如果你在后台启动多个作业,它将等待所有作业完成)
  5. 命名管道(可以提供进程间通信的机制)。
  6. 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,只有当它找到匹配项时才会触发。

相关内容