SLURM:自定义标准输出名称

SLURM:自定义标准输出名称

使用 运行 SLURM 作业时sbatch,slurm 会生成一个标准输出文件,类似于 slurm-102432.out (slurm-jobid.out)。我想将其自定义为(yyyymmddhhmmss-jobid-jobname.txt)。我该怎么做呢?

或者更一般地说,如何在sbatch参数中包含计算变量-o

我在 script.sh 中尝试了以下操作

#SBATCH -p core
#SBATCH -n 6
#SBATCH -t 1:00:00
#SBATCH -J indexing
#SBATCH -o "/home/user/slurm/$(date +%Y%m%d%H%M%S)-$(SLURM_JOB_ID)-indexing.txt"

但这没有用。文件在新目录中的位置是正确的,但文件名只是文字 line $(date +%Y%m%d%H%M%S)-$(SLURM_JOB_ID)-indexing.txt

/home/user/slurm/因此,我正在寻找一种将标准输出文件保存在文件名如下的目录中的方法:20160526093322-10453-indexing.txt

答案1

这是我从以前的答案中得出的结论

  • %j给出工作 ID
  • %x给出工作名称
  • 我不知道如何以所需的格式获取日期。作业 ID 充当跨运行的唯一标识符,文件修改日期捕获日期以供以后分析。

我的 SBATCH 魔法如下所示:

#SBATCH --output=R-%x.%j.out
#SBATCH --error=R-%x.%j.err

我更喜欢添加R-作为前缀,这样我可以轻松移动或删除所有R-*

答案2

你不能,至少不能按照你想要的方式去做。这些#SBATCH行是 shell 注释,恰好由sbatch命令解释,您不能在其中执行 shell 代码。

此外,sbatch-o选项仅理解非常有限的一组替换符号(请参阅下面的手册页摘录)。

可能最接近您想要的结果是sbatch在包装器脚本中运行,该脚本将作业 ID、作业名称以及当前日期和时间附加到文本文件(例如timestamp<TAB>jobid<TAB>jobname)中,然后使用该脚本作业运行完成后重命名输出文件。

time_t,或“自纪元以来的秒数”,即date +%s,是脚本中最有用的日期/时间格式。它可以很容易地按照您想要的方式进行漂亮的打印,而无需先解析它。

squeue -t BF,CA,CD,F,NF,PR,TO编写一个脚本来遍历该文本文件并重命名每个不再运行的作业 ID(使用 检查)并且还未重命名的输出文件并不困难。

仅供参考,手册页sbatch说:

-o,--输出=

指示 Slurm 将批处理脚本的标准输出直接连接到“文件名模式”中指定的文件名。默认情况下,标准输出和标准错误都定向到同一个文件。对于作业数组,默认文件名是slurm-%A_%a.out,由作业 ID 和数组索引%A替换。%a对于其他作业,默认文件名是slurm-%j.out,其中%j被作业 ID 替换。--input option有关文件名规范选项,请参阅。

而且,因为-i它说:

-i,--输入=

指示 Slurm 将批处理脚本的标准输入直接连接到“文件名模式”中指定的文件名。默认情况下,/dev/null在批处理脚本的标准输入上打开,标准输出和标准错误都定向到名为 的文件slurm-%j.out,其中%j被替换为作业分配号,如下所述。

文件名模式可以包含一个或多个替换符号,这些替换符号是%百分号后跟一个字母(例如%j)。

支持的替换符号有:

%A Job array's master job allocation number.
%a Job array ID (index) number.
%j Job allocation number.
%N Node name. Only one file is created, so %N will be replaced
   by the name of the first node in the job, which is the one
   that runs the script.
%u User name.

答案3

该命令的文档sbatch提供了允许的字符替换的完整列表:sbatch 手册页

文件名模式 sbatch 允许文件名模式包含一个或多个替换符号,即百分号“%”后跟一个字母(例如%j)。

\\ 不要处理任何替换符号。

%% 人物 ”%”。

%A 作业数组的主作业分配号。

%a 作业数组 ID(索引)号。

%J 正在运行的作业的 jobid.stepid。 (例如“128.0”)

正在运行的作业的 %j jobid。

%N 短主机名。这将为每个节点创建一个单独的 IO 文件。

%n 相对于当前作业的节点标识符(例如“0”是正在运行的作业的第一个节点) 这将为每个节点创建一个单独的 IO 文件。

%s 正在运行的作业的stepid。

%t 相对于当前作业的任务标识符(排名)。这将为每个任务创建一个单独的 IO 文件。

%u 用户名。

%x 作业名称。

百分号字符和格式说明符之间的数字可用于对 IO 文件名中的结果进行零填充。如果格式说明符对应于非数字数据(例如 %N),则忽略此数字。

下面列出了如何将格式字符串用于作业 ID 为 128、步骤 ID 为 0 的 4 任务作业步骤的一些示例:

工作%J.out

job128.0.out

作业%4j.out

工作0128.out

作业%j-%2t.out

job128-00.out、job128-01.out、...

答案4

这是一个有点有趣的新答案。您无法在此过程中更改日志文件的名称,并且事后更改它也不是理想的选择,因为这涉及将 sbatch 命令包装在更多代码中。相反,您可以使用所需的名称创建一个新的日志文件,该文件“链接”到 sbatch 日志文件。该日志文件将具有您想要的名称,并随着 sbatch 日志文件的更新而更新。在代码末尾,只需删除 sbatch 日志文件,链接文件将是唯一保留的文件。当然,当您的进程运行时您有两个日志文件,但这还不错。

#SBATCH -o something%j.log
[...]
ln -f something${SLURM_JOB_ID}.log coolName.log
[...]
rm something${SLURM_JOB_ID}.log

相关内容