我有 2 个进程,我需要在大量文件上一个接一个地运行。
for file in ` basename -a /path/to/some/data-*`; do
#Manages the number of jobs and cores
SCRIPTNAME=/path_to_my/script.sh
NCORES=90
while [ $(ps -ef | grep -v grep | grep $SCRIPTNAME | wc -l) -ge $NCORES ]; do
sleep 1m
done
echo "${SCRIPTNAME} ${file}"
bash $SCRIPTNAME $file &
done
在所有这些文件完成后,我想以类似的方式运行另一个文件,但我不能在这个文件之后添加另一个 for 循环,因为它会在其他文件完成之前启动。 在第一个循环不再运行进程后,如何运行下一个 for 循环?
我建议你看看snakemake。
它最初是为必须并行分析大量生物样本的情况而设计的,其中某些步骤依赖于先前的步骤。 像这样,如果你的inputfile1已经完成了步骤1,snakemake已经启动了inputfile 1的步骤2,即使inputfile2的步骤1可能仍在运行。 根据您拥有的输入文件数和计算资源数,此方法可能会为您节省一些宝贵的时间。
否则,如果蛇制造不是一种选择,我会选择埃兰斯方法。
或者,可以让第一个脚本在虚拟文件中添加一行作为最后一个命令,并在开始第二次运行之前,每隔 30 秒(或更长时间(检查一次 while 循环,如果此文件包含与 inputdata 相同数量的行数。 像这样,如果您的第一个脚本之一失败,它也不会启动。
这可能看起来像
tot=$(ls /path/to/some/data-* | wc -l)
while sleep 30; do
lines=$(wc -l dummie.txt)
if [ "$tot" == "$lines"]; then
echo -e "All jobs from first script finished! You can now start second script"
fi
done
我相信有更优雅的方式,但这就是我现在想到的。
bash $SCRIPTNAME $file &
返回后台进程的进程 ID。收集所有 ID 并使用wait
命令保持,直到完成所有 ID。