在 Slurm 中将 $USER(或等效项)传递给 --chdir 的方法

Ways to pass $USER (or it's equivalent) to --chdir in Slurm

问题

我正在尝试创建一个脚本,该脚本使用变量自动设置 运行 带有 --chdir 的 sbatch 命令的目录。我的目标是创建一个单一的模板文件,让经验不足的用户可以轻松地使用 运行 我的代码。

环境

在我 运行 正在使用的系统中,所有用户都有一个分配给他们的大文件存储目录,看起来像 /path/$USER。该路径不是 $HOME 目录,也没有作为环境变量存储在其他地方。所有用户都分配有一个 Slurm 帐户,其中 Slurm 用户名匹配 $USER。这意味着 Slurm-specific 变量 %u$USER.

相同

最小(非)工作示例

#!/bin/bash

#SBATCH --partition=debug_5min
#SBATCH --ntasks=1
#SBATCH --mem=4000
#SBATCH --output=jobname_%J_stdout.txt
#SBATCH --error=jobname_%J_stderr.txt
#SBATCH --time=00:05:00
#SBATCH --job-name=user_pass
#SBATCH --chdir=/path/%u
#
################################################

touch testfile.txt

MnWE 的结果

批处理执行,运行 完成时未生成任何文件(testfile.txt、stdout、stderr)。如果我对这个测试脚本进行一些挖掘,我被告知 运行 失败并且输出被重定向到 /tmp/.

有效但未达到目标的方法

我可以在脚本之前传递 --chdir,而不是直接执行 sbatch test.sh,这样我就可以使用 $USER。该命令如下所示:

sbatch --chdir=/path/$USER test.sh

但这并没有解决最初的目标,即制作一个脚本,如果他们害怕终端,则不需要最终用户想太多。

问题 - 重述

有没有办法在 --chdir sbatch headers 中使用变量?

为什么 %u 不像我期望的那样表现?

一个解决方案是用调用 cd 命令替换 --chdir 参数,并为 --output--error 指令提供绝对路径:

#!/bin/bash

#SBATCH --partition=debug_5min
#SBATCH --ntasks=1
#SBATCH --mem=4000
#SBATCH --output=/path/%u/jobname_%J_stdout.txt
#SBATCH --error=/path/%u/jobname_%J_stderr.txt
#SBATCH --time=00:05:00
#SBATCH --job-name=user_pass
#
################################################
cd /path/$USER || exit -1 
touch testfile.txt

至于您重述的问题,Bash 不会扩展 #SBATCH ... 行中的变量,因为这些变量被解释器视为注释,而 Slurm 不会做这项工作。

--chdir 参数根本不接受模式(如 %u);只有简单的字符串。