【问题标题】:Executing a command (only) when prior jobs are finished in Bash(仅)在 Bash 中完成之前的作业时执行命令
【发布时间】:2013-11-27 22:31:04
【问题描述】:

我正在尝试确保在并行命令终止后串行运行命令。

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 队列中使用。有任何想法吗?提前致谢。

【问题讨论】:

    标签: bash parallel-processing jobs


    【解决方案1】:

    您可以使用不带参数的wait 来等待所有之前的作业完成:

    command1 &
    command2 &
    wait
    command3
    

    【讨论】:

    • 感谢您的快速回答!这会成功的。只是为了更进一步,如果我想要像((command1 &; command2 &; wait; command3) &; (commandA &; commandB &; wait; commandC) &) 这样的行为,第一个wait 依赖于command1command2,第二个wait 依赖于commandAcommandB只是,我需要将工作 ID 指定为 wait?
    • 这几乎是你想要的方式。 wait 只等待当前 shell 中的命令。 ( .. ) 创建一个子shell,所以a & ( b & ( c & ); wait ) 只会等待b。另外,&; 无效;只需使用&
    • 提及jobs 命令可能会提供正在运行的作业列表 - jobs -p 仅提供 pid。
    猜你喜欢
    • 2022-10-17
    • 2018-10-28
    • 2019-12-31
    • 2011-02-14
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多