SLURM 作业检查其结束还有多长时间

问题描述 投票:0回答:2

我想知道我是否可以获得 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
),但我找不到任何东西。

jobs slurm
2个回答
3
投票

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
格式。


0
投票

我扩展了 @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'

输出以秒为单位。

© www.soinside.com 2019 - 2024. All rights reserved.