我想知道我是否可以获得 SLURM 作业来检查在
#SBATCH --time
指定的时间过去之前它将继续运行多长时间。
我想到了一个解决方案,但对我来说似乎很可怕:我知道我可以看到该作业已经运行了多长时间,其中
squeue
及其选项。因此,当我想要完成检查时,我可以让作业调用 squeue
,将命令的输出存储在变量(或文件)中,并读取作业开始以来的时间量。像这样的东西
status=$(squeue -j $job_id) //Alternatively squeue -u my_username
status_array=($status)
time_since_start=${status[13]}
那么只需计算时间差即可。上述方法的问题在于作业需要知道自己的
job_id
。即使我使用 -u my_username
,如果我有多个作业同时运行,我仍然需要 job_id
,这是我的典型情况。我能看到让作业知道它的 id
的唯一方法是指示启动它的脚本在文件中写入这样的 id
,然后让作业读取该文件。
我想知道是否存在更简单/更优雅的解决方案,也许使用 SLURM 命令(类似于
squeue -magic_option
),但我找不到任何东西。
squeue
命令可以给你答案:
squeue -h -j $SLURM_JOB_ID -O TimeLeft
要进一步测试该值(该值将采用
hh:mm:ss
格式),您可以使用 awk
获取相应的分钟数:
squeue -h -j SLURM_JOB_ID -O TimeLeft | awk -F: '{ print ($1 * 3600) + ($2 * 60) }'
如果作业运行超过一天,您将必须调整上述内容以应对解析中的
d-hh:mm:ss
格式。
我扩展了 @damienfrancois 的答案,因为
TimeLeft
调用 squeue
的格式可能会根据工作的剩余时间而有所不同。如果剩余时间低于 1 小时,则 TimeLeft
的输出格式将为 mm:ss
,而不是 hh:mm:ss
。如果剩余时间超过24小时,格式为dd-hh:mm:ss
。
我们可以通过添加第二个分隔符、使用
NF
变量并添加 if-else 语句来解释字段数量可能存在的变化:
squeue -h -j $SLURM_JOB_ID -O TimeLeft | awk -F':|-' 'if (NF == 1) print $NF; \
else if (NF == 2) print ($1 * 60) + ($2); \
else if (NF == 3) print ($1 * 3600) + ($2 * 60) + $3; \
else if (NF == 4) print ($1 * 86400) + ($2 * 3600) + ($3 * 60) + $4'
输出以秒为单位。