在 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
);只有简单的字符串。
问题
我正在尝试创建一个脚本,该脚本使用变量自动设置 运行 带有 --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
);只有简单的字符串。