假设我有10K文件和一个处理单个文件的bash
脚本。现在我想同时处理所有这些文件,只有K
脚本并行运行。我不希望(显然)多次处理任何文件。
您如何建议在bash
中实施?
答案 0 :(得分:12)
执行有限数量的并行作业的一种方法是使用GNU parallel。例如,使用以下命令:
find . -type f -print0 | parallel -0 -P 3 ./myscript {1}
您将当前目录(及其子目录)中的所有文件作为参数传递给myscript
,一次一个。 -0
选项将分隔符设置为空字符,-P
选项设置并行执行的作业数。默认并行进程数等于系统中的核心数。群集等中还有其他并行处理选项,记录在案here。
答案 1 :(得分: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
。
这应该足以让您实施该系统。
答案 2 :(得分:1)
for f1 in *;do
(( cnt = cnt +1 ))
if [ cnt -le $k ];then
nohup ./script1 $f1 &
continue
fi
wait
cnt=0
done
请测试一下。没有时间