bash 启动许多进程并阻塞计算机的脚本

bash script launching many processes and blocking computer

我已经写了一个 bash 脚本,目的是 运行 一个 .py 模板 Python 脚本 15,000 次,每次都使用这个 .py 的稍微修改的版本。 在一个 .py 的每个 运行 之后,bash 脚本将发生的事情记录到一个文件中。

bash 脚本,可在我的笔记本电脑上运行并计算 15,000 个东西。

N_SIM=15000
for ((j = 1; j <= $N_SIM; j++))
do
    index=$((j))
    a0=$(awk "NR==${index} { print $1 }" values_a0_in_Xenon_10_20_10_25_Wcm2_RRon.txt)
    dirname="a0_${a0}"
    mkdir -p $dirname
    cd $dirname
    awk -v s="a0=${a0}" 'NR==6 {print s} 1 {print}' ../integration.py > integrationa0included.py
    mpirun -n 1 python3 integrationa0included.py 2&> integration_Xenon.log &
    cd ..
done

它启动进程并且终端看起来像(或类似这样的东西,数字仅用于说明目的,它们并不准确):

[1]
[2]
[3]
...
...
[45]
[1]: exit, success (a message along these lines)
[4]: exit, success
[46]
[47]
[48]
[2]: exit, success
...

并且重复完成一些已启动进程并不断启动新进程的模式,直到启动并完成 15,000 个进程。

我想 运行 在一台非常旧的计算机上执行此操作。 问题是它几乎立即启动了 300 个这样的进程,然后计算机死机了。它基本上崩溃了。我无法执行 CTRL+Z 或 CTRL+C 或键入。冻死了。

我想问你是否对 bash 脚本进行了修改,它只启动 2 个进程,等待 1 完成,启动第 3 个,等待第 2 个完成,启动第 4 个,然后很快。 这样在任何给定时间都没有那么多进程在等待。也许这不会阻止旧计算机。

在您的循环中,将以下代码添加到循环体的开头:

# insert this after `do`
[ "$(jobs -pr | wc -l)" -ge 2 ] && wait -n

如果已经有两个或更多后台作业运行,这会等待至少一个运行作业终止。