4

假设我有 10K 个文件和一个bash处理单个文件的脚本。现在我想同时处理所有这些文件,只有K脚本并行运行。我不想(显然)多次处理任何文件。

你会如何建议实施它bash

4

3 回答 3

12

执行有限数量的并行作业的一种方法是使用GNU 并行。例如,使用以下命令:

find . -type f -print0 | parallel -0 -P 3 ./myscript {1}

您将当前目录(及其子目录)中的所有文件作为参数传递给myscript,一次一个。该-0选项将分隔符设置为空字符,该-P选项设置并行执行的作业数。默认的并行进程数等于系统中的内核数。集群等中的并行处理还有其他选项,在此处记录。

于 2013-06-29T18:30:54.820 回答
5

我很高兴您可以通过使用“(”和“)”轻松地在不同的进程中运行部分脚本。如果添加&,则父进程将不会等待子进程。所以你实际上使用( command1; command2; command3; ... ) &

while ... do
    (
        your script goes here, executed in a separate process

    ) &
    CHILD_PID = $!
done

并且还$!为您提供子进程的 PID。你还需要知道什么?当您到达已k启动的进程时,您需要等待其他进程。这是使用wait <PID>

wait $CHILD_PID

如果您想等待所有这些,只需使用wait.

这应该足以让您实施系统。

于 2013-06-29T17:26:04.957 回答
1
   for f1 in *;do
      (( cnt = cnt +1 ))
      if [ cnt -le $k ];then
         nohup ./script1 $f1 &
         continue
       fi
       wait
       cnt=0
   done

请测试一下。没时间

于 2013-06-29T18:43:13.713 回答