bash - 解析 SLURM 作业墙时间以 bash 变量
问题描述
使用 SLURM,我运行命令
squeue -u enter_username
我得到一个带有以下标题的表格输出
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 $1}')
正如我之前所说,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,分别代表天、小时、分钟和秒。
推荐阅读
- javascript - 评估条件并设置标志和值的最佳表达式
- c# - 如何为 Docker 中托管的 API 启用 HTTPS
- javascript - Node.js 错误 MissingSchemaError:尚未为模型“用户”注册模式。使用 mongoose.model(name, schema)
- javascript - React useRef 在路由更改时返回无法读取 null 属性“样式”的错误
- sql - 如何根据过滤条件选择行
- c++ - 如何将可变参数函数参数传递给 C++ 中的另一个函数(特别是 std::format)?
- c# - 为输入参数“范围”提供的值无效。范围“https://management.azure.com/.default”不存在
- mysql - 有人可以检查我哪里做错了吗?
- php - Yii2 - 位于子文件夹中的渲染视图
- c++ - 在 g++ 9.3.0 中使用 std::experimental::filesystem