2013-11-27 66 views
2

我试图确保命令在并行命令终止后以串行方式运行。在Bash中完成先前作业时执行命令(仅限)

command1 & 
command2 & 
command3 

在上述例子中,command1command2在背景的同时推出,但command3之后立即运行。我知道这是Bash的预期行为,但我想知道是否在command1command2终止之后有一个command3的启动方式。

这可能是可以这样做:

(command1; touch done1) & 
(command2; touch done2) & 
while [ ! -f done1 ] && [ ! -f done2 ]; do sleep 1000; done 
command3 

...但如果一个更优雅的解决方案可我会抓住。因为这些命令注定要在PBS队列中使用,所以加入需要被动。有任何想法吗?提前致谢。

回答

2

您可以使用wait没有参数等待所有以前的作业完成:

command1 & 
command2 & 
wait 
command3 
+0

感谢您的快速答复!这会做到这一点。为了推动它,但进一步,我想要的东西像'((command1&; command2&; wait; command3)&;(commandA&; commandB&; wait; commandC)&)'表现为第一个等待'是依赖'command1'和'command2',第二个'wait',只在'commandA'和'commandB'上,我需要指定作业ID到'wait'? –

+1

这很符合你的想法。 'wait'只等待当前shell中的命令。 '(..)'创建一个子shell,所以'a&(b&(等待)'将只等待'b'。另外,'&;'是无效的;只需使用&&。 –

+1

可能有用提到'jobs'命令会给出正在运行的作业列表 - 'jobs -p'只给出pid。 – bryn