使用 运行 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