在同时执行一些命令之后运行bash命令?


13

我想并行运行一些命令。当所有这些命令完成后,开始下一个命令。我虽然以下方法会起作用

#!/bin/bash
command1 &
command2 &
command3 &&
command4

但事实并非如此。command4当前三个命令全部完成后,我需要运行。

Answers:


28
#!/bin/bash
command1 &
command2 &
command3 &

wait
command4

wait (不带任何参数)将等待,直到所有后台进程都退出。

的完整描述wait了在bash手册:

wait [-n] [n ...]

等待每个指定的子进程并返回其终止状态。每个都n可以是进程ID或作业规范;如果给出了作业说明,则将等待该作业管道中的所有进程。 如果n未给出,则等待所有当前活动的子进程,并且返回状态为零。 如果提供了该 -n选项,则wait等待任何作业终止并返回其退出状态。如果n指定了不存在的进程或作业,则返回状态为127。否则,返回状态为等待的最后一个进程或作业的退出状态。


1
另一个选择是使用类似的方法保存每个孩子的PID,PID1=$!然后使用来等待所有孩子的PID wait "$PID1" "$PID2" "$PID3"。这稍微复杂一点,但是如果进程中有您不想等待的其他子进程,则可以使用。
卡巴斯德(Kasperd)'17年

1
@kasperd在这种情况下,最好使用数组:cmd1 & pids=( $! ); cmd2 & pids+=( $! ); cmd3 & pids+=( $! ); wait "${pids[@]}"或类似的东西。
库沙兰丹

@kasperd“更好”是指“仅使用一个变量”。使用很多方法本质上没有错,对于像这样的小情况可能完全没问题。
库沙兰丹

0

我喜欢这个wait答案,但是就像做学术练习一样,我认为这也会起作用:

bash -c 'command1 & command2 & command3 &' && command4

如果我错了,请纠正我。


2
你测试了吗?它绝对不起作用。示例:time bash -c "sleep 5 &sleep 5 &sleep 5 &" && echo foo 如果没有说bash命令花了五秒钟,它就没有执行您想要的操作。
塞斯·罗伯逊

我用睡眠和回声测试了它,它似乎起作用了。您的示例证明并非如此。
汉堡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.