【问题标题】:how to process several commands concurrently and continue the rest only after all is done on ubuntu如何同时处理多个命令并仅在 ubuntu 上完成后继续其余命令
【发布时间】:2017-01-04 00:56:57
【问题描述】:

具体来说,我有两个命令需要在 Ubuntu 上的 shell 同时运行,比如 command_A 和 command_B。我还有一些其他命令需要在 command_A 和 command_B 完成后运行,命名为 command_rest。此外,command_A 和 command_B 在不同的终端中运行,完成后可以自行关闭。我猜这可能需要与 signal 和 wait 和 gnome-terminal 相关的技术,但我找不到解决方案。

【问题讨论】:

标签: shell concurrency ubuntu-14.04


【解决方案1】:

你可以像这样使用fifo来同步:

# Once in either Terminal
mkfifo A B

# In first Terminal
( echo CommandA; sleep 3; echo done > A ) &

# In second Terminal
( echo CommandB; sleep 8; echo done > B ) &

# In third Terminal
read < A; read < B; echo Rest

基本上,在Rest 可以运行之前,它必须已经从A 和B 读取了一些内容,并且直到CommandA 完成并写入A 和@ 987654327@已完成并写信给B。

以上只是一个示例,它回显了CommandA 和CommandB 和Rest,而不是运行我没有的命令。您实际上会想要这样的东西(我已经对其进行了修改,以便您可以在各个终端的不同目录中)

# Once in either Terminal
mkfifo  /tmp/A  /tmp/B

# In first Terminal
( CommandA; echo done > /tmp/A ) &

# In second Terminal
( CommandB; echo done > /tmp/B ) &

# In third Terminal
read < /tmp/A; read < /tmp/B; commandRest

【讨论】:

  • 我将它写入fifo.sh并使用命令“.fifo.sh”运行它,它的输出如下所示:CommandA\n CommandB\n Rest\n [2]- Done (echo CommandA; sleep 3; echo done >A )\n [3]+ Done (echo CommandB; sleep 8; echo done >B)\n (\n 用于另一行)(当我输入另一个命令时出现最后一行in) 它似乎已经奏效了,但我只是好奇最后两行的输出是什么意思。
  • 其他行只是为了展示一个工作示例,而无需任何人拥有您的CommandA、CommandB 和CommandRest。我已经更新了,请再看一遍。
  • 感谢您更新您的答案〜也许一个具体的例子会澄清我的问题。例如,如果我想在两个终端中使用“读取”命令,然后在每个终端都收到键盘后,我将“回显完成输入”写为 commandRest。我试图用你的方法来实现,但它不起作用,因为我会卡在输入上。如果我尝试在 CommandA 和 CommandB 中使用“gnome-terminal -e”命令打开新终端,它可以同时显示两个新终端,但 commandRest 不会等待我的输入而只是回显。所以我想知道如何修复它。谢谢!
  • 抱歉,我看不出是哪个部分导致您出现问题:-) 我对代码进行了小幅更新,这样您就可以位于各个终端的不同目录中 - 也许这会有所帮助.我看不出你的CommandRest 怎么可能做任何事情,直到它从两个fifos 中读取了done 这个词——它不能。
【解决方案2】:

由于您似乎不太擅长基于 fifo 的同步,您可以尝试使用 GNU Parallel,它在安装时会创建一个名为 sem 的符号链接,它充当一个信号量。

所以,在 1 号航站楼,你会这样做:

sem -j 2 --id mark CommandA

在 2 号航站楼,您会这样做:

sem -j 2 --id mark CommandB

然后,在任何你想等待两者完成的地方,你都可以这样做:

sem --id mark --wait ; CommandRest

【讨论】:

  • 感谢您的额外建议。我尝试将 sleep 10 作为 CommandA 和 CommandB 并且效果很好。但是,当我将read 用作CommandA 和CommandB,echo "received" 用作CommandRest 时,前两个会卡住,并且无法接收任何键盘输入。当我关闭前两个终端时,第三个终端确实显示“已收到”。所以问题是命令read 在这种情况下不能正常工作。你知道怎么解决吗?
猜你喜欢
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2021-05-10
相关资源
最近更新 更多