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


8

我想生成两个子进程,但是要等到第一个子进程在执行中达到某个点(可以通过检查stdout来确定)之后再生成第二个子进程。我不确定要完成此操作需要使用哪些unix命令,并且由于unix命令名的简洁性和有时是隐秘的性质,因此很难通过Google查找任何内容。

我不是要寻求解决的特定问题的解决方案(尽管任何其他指针都会受到欢迎),我主要关心的是知道我想查找并学习使用哪些unix命令。


您愿意使用Python吗?
xrisk

3
在不知道如何确定“执行的特定点”的情况下,这是非常模糊的。
muru

@muru编辑以澄清
w.brian

因此,您实际上需要3个流程。1.运行,创建输出;2.监视1的输出,并在某个时间点启动3.足以让您开始制作自己正在制作的信息。但这不是设计程序的好方法。
djsmiley2kStaysInside,

Answers:


7

您可以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"

1
+1这是一个非常有创意的答案。如果您需要proc1的其余输出,它将变得更加复杂。您需要使用tee和其他文件描述符或命名管道之类的东西。

7

我不确定您提出的问题是否有一个简洁的命令/答案(即执行该问题的某个点)-但是可以使用一些工具/技术来提出一个解决方案,可能涉及多个解决方案之一以下,也许还有其他我不知道的事情:

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

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


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

如果可以通过确定“执行中的某个点” stdout,那么接下来如何?

proc1 | grep "stdout trigger string" && proc2

&&当应该火grep的回报0,当它找到一个匹配它只做。


1
grep将继续进行,直到关闭stdin。在那之前,它不会返回任何值(0或其他)。
鲍勃

@Bob哦,谢谢。。我将尝试改写这个想法。
Louis Waweru

@bob尤其会造成混乱和脱节,并且滥用了该工具,但是您可以使用fail2ban监视日志文件(即,将管道标准输出到文件),然后编写规则以在该行是第二个脚本时执行第二个脚本发现(但我侦察修改触发器文件并使用inotify是一个更优雅的解决方案)
davidgo

1
如果targetstring在proc1输出中出现多次,则proc2将运行多次。如果你这样做proc2 &,然后break,不会发生这种情况,但会关闭管道,使PROC1终止过早。另外,您可以在启动proc2之后设置一个标志,并使用它来确保proc2不再运行。与其他答案一样,proc1输出的其余部分将被丢弃,因此,如果需要它,则需要做更多的工作。

1
@乔好点。原来的问题其实只是问什么命令是提供给有工作,所以这真的只是一个答案展示其中的一些命令潜在的(主要是|grep这里)。
Louis Waweru
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.