使用bash执行多个进程

时间:2013-11-03 17:23:40

标签: linux bash process

我想使用bash并行运行多个进程。我做了以下事情:

./proc sth1 & ./proc sth2 & ./proc sth3 & ... & ./proc sthN &

上述问题是它立即结束。所以,如果我这样做: time (./proc sth1 & ... & ./proc sthN &)我回来0

我想运行上面的命令,但我希望它在最后一个进程完成时停止。 因此,如果./proc sthX需要10秒,而所有其他进程需要1秒。我想等待10秒,直到上面的命令返回。有没有办法做到这一点?

4 个答案:

答案 0 :(得分:5)

最后请致电wait。引用bash手册Job control builtins

  

wait [jobspec or pid ...]

     

等待每个进程ID pid或作业规范jobspec指定的子进程退出并返回等待的最后一个命令的退出状态。如果给出了作业规范,则等待作业中的所有进程。 如果没有给出参数,则等待所有当前活动的子进程,返回状态为零。如果jobspec和pid都没有指定shell的活动子进程,则返回状态为127。

一个例子:

#!/bin/bash
function test {
    time=$(( RANDOM % 10 ))
    echo "Sleeping for $time"
    sleep "$time"
    echo "Slept for $time"
}

time (
    test & test & test & test & test & test &
    wait
    echo "Finished all."
)

答案 1 :(得分:1)

wait专为此而设计:

./proc sth1 & ./proc sth2 & ./proc sth3 & ... & ./proc sthN &
 wait

一些文档:

$ LANG=C help wait
wait: wait [id]
    Wait for job completion and return exit status.

    Waits for the process identified by ID, which may be a process ID or a
    job specification, and reports its termination status.  If ID is not
    given, waits for all currently active child processes, and the return
    status is zero.  If ID is a a job specification, waits for all processes
    in the job's pipeline.

    Exit Status:
    Returns the

身份证号码;如果ID无效或无效选项,则失败     给出。

另一个解决方案是获取所有pid并为所有这些pid放置wait

答案 2 :(得分:0)

wait与作业列表一起使用的另一个示例:

nbf=0
jobs -p|while read -r; do
    wait $REPLY || (( nbf++ ))
done
echo "$nbf jobs ended with failure" >&2

答案 3 :(得分:0)

虽然“等待和组合”可能就足够了,但我发现这不是我想要的大部分时间。我想要的是,如果任何命令默认失败,返回代码将指示失败。所以我创建了一个名为par的小工具:

https://github.com/k-bx/par