将 SLURM 作业墙时间解析为 bash 个变量
Parse SLURM job wall time to bash variables
使用 SLURM,我 运行 命令
squeue -u enter_username
我得到一个 table 输出,标题如下
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
我正在尝试记录工作 运行 的持续时间。这次我找不到 SLURM 提供的环境变量来捕获,所以我想我只能解析 squeue
的输出。这并不像我想象的那么容易,因为挂钟没有固定的格式。换句话说,它并不总是显示 dd-HH:MM:SS。如果没有天,那么输出只是 HH:MM:SS,如果没有小时,输出是 MM:SS,等等
我正在使用 bash 执行此操作,我需要捕获日期 (dd) 和小时 (HH) 并将它们分别分配给一个变量。当格式是动态的时,我很难做到这一点。
要捕获时间条目,我只需执行以下操作(在 SLURM bash 脚本中)
time_str=$(squeue -u enter_username | grep "$SLURM_JOB_ID" | cut -d "R" -f2- | gawk '{print }')
正如我之前所说,time_str
没有固定的格式。希望有经验的大侠帮忙。
通过阅读 squeue
命令的手册页,您似乎可以通过让 squeue
只输出您需要的信息来简化问题:
squeue -h -j ${jobid} -O timeused
那么您的任务就是简单地解析该输出,可以按如下方式完成:
#!/bin/bash
line="-$(squeue -h -j ${jobid} -O timeused)" # Leading '-' aids parsing.
parts=( 0 0 0 0 )
index=3
while [ ${#line} -gt 0 ]; do
parts[${index}]=${line##*[-:]}
line=${line%[-:]*}
((index--))
done
现在数组${parts[*]}
恰好包含4个元素,0到3,分别代表日、时、分、秒。
上面@Andrew Vickers 提出的解决方案按预期工作。但是,我更进一步实施了固定的 2 位数字格式
index=0
while [ ${index} -lt 4 ]; do
if [ ${#parts[${index}]} -lt 2 ]; then
parts[${index}]="0${parts[${index}]}"
fi
((index++))
done
条件检查可以合并到他的答案中,但需要调整他的循环以格式化所有变量。
使用 SLURM,我 运行 命令
squeue -u enter_username
我得到一个 table 输出,标题如下
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
我正在尝试记录工作 运行 的持续时间。这次我找不到 SLURM 提供的环境变量来捕获,所以我想我只能解析 squeue
的输出。这并不像我想象的那么容易,因为挂钟没有固定的格式。换句话说,它并不总是显示 dd-HH:MM:SS。如果没有天,那么输出只是 HH:MM:SS,如果没有小时,输出是 MM:SS,等等
我正在使用 bash 执行此操作,我需要捕获日期 (dd) 和小时 (HH) 并将它们分别分配给一个变量。当格式是动态的时,我很难做到这一点。
要捕获时间条目,我只需执行以下操作(在 SLURM bash 脚本中)
time_str=$(squeue -u enter_username | grep "$SLURM_JOB_ID" | cut -d "R" -f2- | gawk '{print }')
正如我之前所说,time_str
没有固定的格式。希望有经验的大侠帮忙。
通过阅读 squeue
命令的手册页,您似乎可以通过让 squeue
只输出您需要的信息来简化问题:
squeue -h -j ${jobid} -O timeused
那么您的任务就是简单地解析该输出,可以按如下方式完成:
#!/bin/bash
line="-$(squeue -h -j ${jobid} -O timeused)" # Leading '-' aids parsing.
parts=( 0 0 0 0 )
index=3
while [ ${#line} -gt 0 ]; do
parts[${index}]=${line##*[-:]}
line=${line%[-:]*}
((index--))
done
现在数组${parts[*]}
恰好包含4个元素,0到3,分别代表日、时、分、秒。
上面@Andrew Vickers 提出的解决方案按预期工作。但是,我更进一步实施了固定的 2 位数字格式
index=0
while [ ${index} -lt 4 ]; do
if [ ${#parts[${index}]} -lt 2 ]; then
parts[${index}]="0${parts[${index}]}"
fi
((index++))
done
条件检查可以合并到他的答案中,但需要调整他的循环以格式化所有变量。