如何同时从多个目录中执行 SLURM 脚本?
How can I execute a SLURM script from within multiple directories simultaneously?
我想同时从 多个目录中执行 SLURM 脚本。更具体地说,我有十个数组文件夹,编号为 array_1
到 array_10
,我想从中执行脚本。在每个目录中,脚本创建 10 个子目录,标记为 ${SLURM_ARRAY_TASK_ID}_ztag
。但是,我必须分别从十个 array_ 目录中的每一个目录中手动执行 SLURM 脚本。当我不得不一遍又一遍地这样做时,这会变得很麻烦。
通常,使用 shell 脚本,这将是简单的 for
循环,但是因为 #SBATCH
不被 bash 解释,我没有任何成功。当前脚本(分别位于每个数组文件夹中的 运行)是:
#!/bin/bash
#SBATCH -o <some_thing>.o%j
#SBATCH --time=<time> #specify the time
#SBATCH --array=1-10 #ten arrays
#SBATCH -c 1
#SBATCH -C dodeca96gb
#SBATCH --mem=<memory>
echo "SLURM_JOBID: " $SLURM_JOBID
echo "SLURM_ARRAY_TASK_ID: " $SLURM_ARRAY_TASK_ID
echo "SLURM_ARRAY_JOB_ID: " $SLURM_ARRAY_JOB_ID
mkdir ${SLURM_ARRAY_TASK_ID}_ztagA #creates 10 subdirs w/i ea. array
cd ${SLURM_ARRAY_TASK_ID}_ztagA
$ROSETTA3BIN/bin/rna_denovo.default.linuxgccrelease -s ./<dir>/*pdb -nstruct 100 -fasta ./<fastafile>.fasta -secstruct_file ./<dot-brackets>.secstruct
然后我输入 sbatch <filename>.slurm
并且脚本从脚本执行的任何目录中创建子目录,因此需要 cd
行,所以让它从所有十个目录中执行同时排列数组一直很棘手。我尝试了以下各种组合:
#!/bin/bash
#SBATCH --array=1-10
#SBATCH --chdir=./array_%a
#SBATCH -o ./array_%a/<some_thing>.o%j #STDOUT
#SBATCH --time=<time>
#SBATCH -c 1
#SBATCH -C dodeca96gb
#SBATCH --mem=<memory>
echo "SLURM_JOBID: " $SLURM_JOBID
echo "SLURM_ARRAY_TASK_ID: " $SLURM_ARRAY_TASK_ID
echo "SLURM_ARRAY_JOB_ID: " $SLURM_ARRAY_JOB_ID
for i in {1..10}
do
mkdir -p ./array_${i}/${SLURM_ARRAY_TASK_ID}_ztagA
cd ./array_${i}/${SLURM_ARRAY_TASK_ID}_ztagA
$ROSETTA3BIN/bin/rna_denovo.default.linuxgccrelease -s ./<dir>/*pdb -nstruct 100 -fasta ./<fastafile>.fasta -secstruct_file ./<dot-brackets>.secstruct
wait
done
我试过将 for
循环参数 before/after 放在不同的行中,包括 wait
和 done
,但我收到一条错误消息说它不能打开 fasta、secstruct 和/dir。我也试过先创建 10 个数组(这很容易)然后做:
#!/bin/bash
for i in {1..10}
do
sbatch ./array_{i}/<filename>.slurm
wait
done
但这不会将输出文件或子目录放入数组文件夹中;它要么将它们留在父级中。
有什么建议吗?
经过几天断断续续的尝试,我弄明白了。我写了一个 shell 脚本在每个目录中执行 SLURM,而不是尝试编辑 SLURM 脚本本身。
#!/bin/bash
for i in {1..10}
do
cd array_${i}
sbatch ./<name_of_slurm_script>.slurm
cd ../
wait
done
我想同时从 多个目录中执行 SLURM 脚本。更具体地说,我有十个数组文件夹,编号为 array_1
到 array_10
,我想从中执行脚本。在每个目录中,脚本创建 10 个子目录,标记为 ${SLURM_ARRAY_TASK_ID}_ztag
。但是,我必须分别从十个 array_ 目录中的每一个目录中手动执行 SLURM 脚本。当我不得不一遍又一遍地这样做时,这会变得很麻烦。
通常,使用 shell 脚本,这将是简单的 for
循环,但是因为 #SBATCH
不被 bash 解释,我没有任何成功。当前脚本(分别位于每个数组文件夹中的 运行)是:
#!/bin/bash
#SBATCH -o <some_thing>.o%j
#SBATCH --time=<time> #specify the time
#SBATCH --array=1-10 #ten arrays
#SBATCH -c 1
#SBATCH -C dodeca96gb
#SBATCH --mem=<memory>
echo "SLURM_JOBID: " $SLURM_JOBID
echo "SLURM_ARRAY_TASK_ID: " $SLURM_ARRAY_TASK_ID
echo "SLURM_ARRAY_JOB_ID: " $SLURM_ARRAY_JOB_ID
mkdir ${SLURM_ARRAY_TASK_ID}_ztagA #creates 10 subdirs w/i ea. array
cd ${SLURM_ARRAY_TASK_ID}_ztagA
$ROSETTA3BIN/bin/rna_denovo.default.linuxgccrelease -s ./<dir>/*pdb -nstruct 100 -fasta ./<fastafile>.fasta -secstruct_file ./<dot-brackets>.secstruct
然后我输入 sbatch <filename>.slurm
并且脚本从脚本执行的任何目录中创建子目录,因此需要 cd
行,所以让它从所有十个目录中执行同时排列数组一直很棘手。我尝试了以下各种组合:
#!/bin/bash
#SBATCH --array=1-10
#SBATCH --chdir=./array_%a
#SBATCH -o ./array_%a/<some_thing>.o%j #STDOUT
#SBATCH --time=<time>
#SBATCH -c 1
#SBATCH -C dodeca96gb
#SBATCH --mem=<memory>
echo "SLURM_JOBID: " $SLURM_JOBID
echo "SLURM_ARRAY_TASK_ID: " $SLURM_ARRAY_TASK_ID
echo "SLURM_ARRAY_JOB_ID: " $SLURM_ARRAY_JOB_ID
for i in {1..10}
do
mkdir -p ./array_${i}/${SLURM_ARRAY_TASK_ID}_ztagA
cd ./array_${i}/${SLURM_ARRAY_TASK_ID}_ztagA
$ROSETTA3BIN/bin/rna_denovo.default.linuxgccrelease -s ./<dir>/*pdb -nstruct 100 -fasta ./<fastafile>.fasta -secstruct_file ./<dot-brackets>.secstruct
wait
done
我试过将 for
循环参数 before/after 放在不同的行中,包括 wait
和 done
,但我收到一条错误消息说它不能打开 fasta、secstruct 和/dir。我也试过先创建 10 个数组(这很容易)然后做:
#!/bin/bash
for i in {1..10}
do
sbatch ./array_{i}/<filename>.slurm
wait
done
但这不会将输出文件或子目录放入数组文件夹中;它要么将它们留在父级中。
有什么建议吗?
经过几天断断续续的尝试,我弄明白了。我写了一个 shell 脚本在每个目录中执行 SLURM,而不是尝试编辑 SLURM 脚本本身。
#!/bin/bash
for i in {1..10}
do
cd array_${i}
sbatch ./<name_of_slurm_script>.slurm
cd ../
wait
done