如何批量运行命令?

如何批量运行命令?

我有以下脚本:

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 32xargs 一次最多运行 32 个进程。这-n 1意味着最多向命令传递一个参数(如果没有它,它可能会将所有文件发送到单个命令,因此无法并行执行)。

因此,在这种情况下,请设置-P为您的批处理大小。另一个选项(和好处)是,您可以设置-P为实际要使用的并行量。虽然该&方法将为每个命令启动一个进程,但 xargs 会将进程数限制为您设置的进程数。这意味着您可以将并行度定位到您拥有的核心数,或者使用较小的数量以防止大型批处理使您的机器运行缓慢。

哦,当然,command用你的实际命令替换。

相关内容