我写了下面的bash脚本,它运行良好,除了一些随机的时刻,它完全冻结,不会进一步超过a0
的某个值
export OMP_NUM_THREADS=4
N_SIM=15000
N_NODE=1
for ((i = 1; i <= $N_SIM; i++))
do
index=$((i))
a0=$(awk "NR==${index} { print $2 }" Intensity_Wcm2_versus_a0_10_20_10_25_range.txt)
dirname="a0_${a0}"
if [ -d "${dirname}" ]; then
cd -P -- "${dirname}" # enter the directory because it exists already
if [ -f "ParticleBinning0.h5" ]; then # move to next directory because the sim has been already done and results are there
cd ..
echo ${a0}
echo We move to the next directory because ParticleBinning0.h exists in this one already.
continue 1
else
awk -v s="a0=${a0}" 'NR==6 {print s} 1 {print}' ../namelist_for_smilei.py > namelist_for_smilei_a0included.py
echo ${a0}
mpirun -n 1 ../smilei namelist_for_smilei_a0included.py 2&> smilei.log
cd ..
fi
else
mkdir -p $dirname
cd $dirname
awk -v s="a0=${a0}" 'NR==6 {print s} 1 {print}' ../namelist_for_smilei.py > namelist_for_smilei_a0included.py
echo ${a0}
mpirun -n 1 ../smilei namelist_for_smilei_a0included.py 2&> smilei.log
cd ..
fi
done
我需要让它运行12个小时左右,才能完成所有15000个模拟。
一个mpirun -n 1 ../smilei namelist_for_smilei.py 2&> smilei.log
命令平均运行4秒。
有时它只是停在a0
的一个值上,屏幕上最后打印的a0
的值就是a0_12.032131
。它保持这样,保持这样,没有理由。smilei.log
中没有来自特别有故障的a0_12.032131
文件夹的输出。所以我不知道a0
的这个特殊值发生了什么。a0
的任何值都不是特别重要,我可以不计算a0
的1个特定值。
我试着在Ubuntu中使用超时实用程序,以某种方式使它超过a0的任何值,这需要2分钟以上的运行时间。如果它需要更多的时间来运行,那么它显然失败了,并停止了整个进程的向前运行。
写这样的剧本超出了我的能力。
我的特定管道的模板应该是什么样子的?
谢谢!
这个mpirun
程序似乎挂起了。正如您所说,您可以使用timeout
实用程序在经过合理的时间后终止其执行:
timeout --signal INT 2m mpirun...
根据mpirun
处理信号的方式,可能需要使用KILL而不是INT来终止进程。