我想生成两个子进程,但是要等到第一个子进程在执行中达到某个点(可以通过检查stdout来确定)之后再生成第二个子进程。我不确定要完成此操作需要使用哪些unix命令,并且由于unix命令名的简洁性和有时是隐秘的性质,因此很难通过Google查找任何内容。
我不是要寻求解决的特定问题的解决方案(尽管任何其他指针都会受到欢迎),我主要关心的是知道我想查找并学习使用哪些unix命令。
我想生成两个子进程,但是要等到第一个子进程在执行中达到某个点(可以通过检查stdout来确定)之后再生成第二个子进程。我不确定要完成此操作需要使用哪些unix命令,并且由于unix命令名的简洁性和有时是隐秘的性质,因此很难通过Google查找任何内容。
我不是要寻求解决的特定问题的解决方案(尽管任何其他指针都会受到欢迎),我主要关心的是知道我想查找并学习使用哪些unix命令。
Answers:
您可以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"
这只是一个主意,但是需要第一个进程将其输出传递给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
,当它找到一个匹配它只做。
proc2 &
,然后break
,不会发生这种情况,但会关闭管道,使PROC1终止过早。另外,您可以在启动proc2之后设置一个标志,并使用它来确保proc2不再运行。与其他答案一样,proc1输出的其余部分将被丢弃,因此,如果需要它,则需要做更多的工作。
|
和grep
这里)。