w.b*_*ian 8 bash bash-scripting
我想生成两个子进程,但是要等到第一个子进程到达执行中的某个点(可以通过检查 stdout 来确定),然后再生成第二个子进程。我不确定哪些 unix 命令会参与完成这个任务,并且由于 unix 命令名称的简洁和有时神秘的性质,很难通过谷歌找到任何东西。
我不是在寻求解决我正在尝试解决的特定问题的解决方案(尽管任何额外的指针都会受到赞赏),我主要关心的是知道我想要查找和学习使用哪些 unix 命令。
我不确定您提出的问题是否有一个优雅的命令/答案(即在执行过程中达到某个点)-但是有一些工具/技术可用于制定解决方案,可能涉及超过 1 个以下,也许还有其他我还不知道的事情:
编写和检查锁定文件也是常见的做法(专业提示 - 如果您可以控制环境,请写入 ramdisk 而不是 /tmp - 在许多发行版中,这是 /dev/shm)。
您可以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}
--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"
Run Code Online (Sandbox Code Playgroud)
这只是一个想法,但让第一个进程通过管道将其输出传输到 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
,只有在找到匹配时才会触发。
归档时间: |
|
查看次数: |
922 次 |
最近记录: |