我想使用bash并行运行多个进程。我做了以下事情:
./proc sth1 & ./proc sth2 & ./proc sth3 & ... & ./proc sthN &
上述问题是它立即结束。所以,如果我这样做:
time (./proc sth1 & ... & ./proc sthN &)
我回来0
。
我想运行上面的命令,但我希望它在最后一个进程完成时停止。
因此,如果./proc sthX
需要10秒,而所有其他进程需要1秒。我想等待10秒,直到上面的命令返回。有没有办法做到这一点?
答案 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
的小工具: