我有以下脚本:
command file1 &
command file2 &
command file3 &
command file4 &
command file5 &
command file6 &
# SOME OTHER COMMAND
command file7 &
command file8 &
command file9 &
command file10 &
command file11 &
command file12 &
在“其他命令”的位置,我希望有一个命令暂停执行下一个命令,直到它之前的所有进程都完成,这样我就可以有效地以“批量”方式运行命令。我该怎么做?
答案1
您应该能够使用 bash shell 的内置wait
命令。来自man bash
(重点是我的):
wait [-n] [n ...]
Wait for each specified child process and return its termination
status. Each n may be a process ID or a job specification; if a
job spec is given, all processes in that job's pipeline are
waited for. If n is not given, all currently active child pro‐
cesses are waited for, and the return status is zero. If the -n
option is supplied, wait waits for any job to terminate and
returns its exit status. If n specifies a non-existent process
or job, the return status is 127. Otherwise, the return status
is the exit status of the last process or job waited for.
所以
command file1 &
command file2 &
command file3 &
command file4 &
command file5 &
command file6 &
wait
command file7 &
command file8 &
command file9 &
command file10 &
command file11 &
command file12 &
答案2
如果你想更花哨一点,可以使用 bash 脚本
batch() {
for arg; do
theCommand "$arg" &
done
wait
}
batch file{1..6}
batch file{7..12}
答案3
xargs
当您使用不同的参数运行相同的命令时是一个很好的选择。
echo file{1..32} | xargs -P 32 -n 1 command
指示-P 32
xargs 一次最多运行 32 个进程。这-n 1
意味着最多向命令传递一个参数(如果没有它,它可能会将所有文件发送到单个命令,因此无法并行执行)。
因此,在这种情况下,请设置-P
为您的批处理大小。另一个选项(和好处)是,您可以设置-P
为实际要使用的并行量。虽然该&
方法将为每个命令启动一个进程,但 xargs 会将进程数限制为您设置的进程数。这意味着您可以将并行度定位到您拥有的核心数,或者使用较小的数量以防止大型批处理使您的机器运行缓慢。
哦,当然,command
用你的实际命令替换。