我将使用哪些命令来连续创建两个子进程?

w.b*_*ian 8 bash bash-scripting

我想生成两个子进程,但是要等到第一个子进程到达执行中的某个点(可以通过检查 stdout 来确定),然后再生成第二个子进程。我不确定哪些 unix 命令会参与完成这个任务,并且由于 unix 命令名称的简洁和有时神秘的性质,很难通过谷歌找到任何东西。

我不是在寻求解决我正在尝试解决的特定问题的解决方案(尽管任何额外的指针都会受到赞赏),我主要关心的是知道我想要查找和学习使用哪些 unix 命令。

dav*_*dgo 7

我不确定您提出的问题是否有一个优雅的命令/答案(即在执行过程中达到某个点)-但是有一些工具/技术可用于制定解决方案,可能涉及超过 1 个以下,也许还有其他我还不知道的事情:

  1. 后台进程 (&)
  2. 条件执行(&& 和 ||)
  3. 睡觉
  4. 等待(我希望这会特别有用 - 如果您在后台启动 1 个以上的作业,它将等到所有作业完成)
  5. 命名管道(它可以提供一种在进程之间进行对话的机制)。
  6. 节点通知等待

编写和检查锁定文件也是常见的做法(专业提示 - 如果您可以控制环境,请写入 ramdisk 而不是 /tmp - 在许多发行版中,这是 /dev/shm)。


Phi*_*ler 7

您可以xargs为此使用该实用程序。它可以为 stdin 上的每一行运行一个命令,所以我们只需要确保xargs在它应该启动命令时在 stdin 上获取一行作为输入,这可以通过以下方式完成grep

proc1 | grep --max-count=1 "${targetString}" | xargs --max-lines=1 --no-run-if-empty --replace -- proc2
Run Code Online (Sandbox Code Playgroud)

参数--max-count=1--max-lines=1--no-run-if-empty确保在第一次输出proc2时恰好启动一次,并且从不如果从不输出。该避免追加输入线到它的命令行。proc1${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"
Run Code Online (Sandbox Code Playgroud)


Lou*_*eru 6

这只是一个想法,但让第一个进程通过管道将其输出传输到 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
Run Code Online (Sandbox Code Playgroud)

如果“执行中的某个点”可以由 确定stdout,那么以下情况如何?

proc1 | grep "stdout trigger string" && proc2

&&应该在grep返回时触发0,只有在找到匹配时才会触发。