我正在尝试同时运行多个作业。我已经编写了一个脚本来逐个运行该作业,但我想立即提交所有这些作业。它不应该等待前一个工作完成。脚本如下,
#!/bin/bash --login
# Default job location in current directory
#SBATCH -p multicore
#SBATCH -n 4 # Use 4 cores
module load gaussian/g16c01_em64t
export GAUSS_SCRDIR=/scratch/$USER/gau_temp_$JOB_ID
mkdir -p $GAUSS_SCRDIR
export GAUSS_PDEF=$NSLOTS
jobnames=($(seq 1 1 100))
for i in ${jobnames[@]}; do
$g16root/g16/g16 < "job_"${i}".gjf" > "job_"${i}".out"
done
作业的输入文件位于同一目录中,名称为 job_1.gjf、job_2.gjf...job_100.gjf。此代码在顺序作业运行中运行良好。
答案1
正如注释所示,如果您只使用 bash,则需要使用&
将作业放入后台。
改变
for i in ${jobnames[@]}; do
$g16root/g16/g16 < "job_"${i}".gjf" > "job_"${i}".out"
done
到
for i in ${jobnames[@]}; do
$g16root/g16/g16 < "job_"${i}".gjf" > "job_"${i}".out" &
done
wait
允许循环中进行一些缩进,使作业并行运行,并在最后等待它们全部完成
当你这样做时我会倾向于改变
jobnames=($(seq 1 1 100))
for i in ${jobnames[@]}; do
到
for i in {1..100}; do
消除对该seq
实用程序的需求,只需使用 bash 内置函数,因为这个问题被标记为bash
.