如何在 slurm 作业(从 srun 开始)完全完成之前暂停脚本?
How to hold up a script until a slurm job (start with srun) is completely finished?
我正在 运行 使用 SLURM 创建一个作业数组,其中包含以下作业数组脚本(我 运行 和 sbatch job_array_script.sh [args]
:
#!/bin/bash
#SBATCH ... other options ...
#SBATCH --array=0-1000%200
srun ./job_slurm_script.py
echo 'open' > status_file.txt
为了解释,我希望 job_slurm_script.py
作为数组作业 运行 1000 次,最多并行 200 个任务。当 所有 完成后,我想写 'open' 到 status_file.txt
。这是因为实际上我有超过 10,000 个作业,这超出了我的集群的 MaxSubmissionLimit,所以我需要将它分成更小的块(在 1000 个元素的作业数组中)并且 运行 它们一个接一个(仅当上一个完成时)。
但是,为了使它起作用,echo 语句只能在整个作业数组完成后触发(除此之外,我有一个循环检查 status_file.txt
以查看作业是否完成,即当内容是字符串 'open').
到目前为止,我认为 srun
会在整个作业数组完成之前保留脚本。但是,有时 srun
"returns" 脚本会在作业完成之前转到 echo 语句,因此所有后续作业都会从集群中反弹,因为它超出了提交限制。
那么如何使 srun
"hold up" 直到整个作业数组完成?
您可以使用wait
bash 命令。它将等到上面的任何代码行完成。因此你的脚本应该是这样的:
#!/bin/bash
#SBATCH ... other options ...
#SBATCH --array=0-1000%200
srun ./job_slurm_script.py
wait
echo 'open' > status_file.txt
您可以将标志 --wait
添加到 sbatch。
查看 sbatch 的手册页以获取有关 --wait
的信息。
您可以结合使用 sbatch
中的 --wait
选项和 bash 中的 wait
将作业发送到集群,暂停脚本执行直到这些完成,然后继续。例如
#!/bin/bash
set -e
date
for((i=0; i<5; i++)); do
sbatch -W --wrap='echo "hello from $SLURM_ARRAY_TASK_ID"; sleep 10' &
done;
wait
date
echo "I am finished"
我正在 运行 使用 SLURM 创建一个作业数组,其中包含以下作业数组脚本(我 运行 和 sbatch job_array_script.sh [args]
:
#!/bin/bash
#SBATCH ... other options ...
#SBATCH --array=0-1000%200
srun ./job_slurm_script.py
echo 'open' > status_file.txt
为了解释,我希望 job_slurm_script.py
作为数组作业 运行 1000 次,最多并行 200 个任务。当 所有 完成后,我想写 'open' 到 status_file.txt
。这是因为实际上我有超过 10,000 个作业,这超出了我的集群的 MaxSubmissionLimit,所以我需要将它分成更小的块(在 1000 个元素的作业数组中)并且 运行 它们一个接一个(仅当上一个完成时)。
但是,为了使它起作用,echo 语句只能在整个作业数组完成后触发(除此之外,我有一个循环检查 status_file.txt
以查看作业是否完成,即当内容是字符串 'open').
到目前为止,我认为 srun
会在整个作业数组完成之前保留脚本。但是,有时 srun
"returns" 脚本会在作业完成之前转到 echo 语句,因此所有后续作业都会从集群中反弹,因为它超出了提交限制。
那么如何使 srun
"hold up" 直到整个作业数组完成?
您可以使用wait
bash 命令。它将等到上面的任何代码行完成。因此你的脚本应该是这样的:
#!/bin/bash
#SBATCH ... other options ...
#SBATCH --array=0-1000%200
srun ./job_slurm_script.py
wait
echo 'open' > status_file.txt
您可以将标志 --wait
添加到 sbatch。
查看 sbatch 的手册页以获取有关 --wait
的信息。
您可以结合使用 sbatch
中的 --wait
选项和 bash 中的 wait
将作业发送到集群,暂停脚本执行直到这些完成,然后继续。例如
#!/bin/bash
set -e
date
for((i=0; i<5; i++)); do
sbatch -W --wrap='echo "hello from $SLURM_ARRAY_TASK_ID"; sleep 10' &
done;
wait
date
echo "I am finished"