首页 > 解决方案 > 在 Slurm 中将 $USER(或等效项)传递给 --chdir 的方法

问题描述

问题

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

环境

在我运行的系统中,所有用户都有一个分配给他们的大文件存储目录,看起来像/path/$USER. 路径不是$HOME目录,也不会作为环境变量存储在其他地方。所有用户都分配有一个 Slurm 帐户,其中 Slurm 用户名匹配$USER。这意味着特定于 Slurm 的变量%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/.

什么有效,但没有达到目标

我可以在脚本之前通过,而不是sbatch test.sh直接执行--chdir,允许我使用$USER. 该命令如下所示:

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

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

问题 - 重述

有没有办法在--chdirsbatch 标头中使用变量?

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

标签: environment-variablesslurmsbatch

解决方案


一种解决方案可能是将--chdir参数替换为对命令的调用,并为and指令cd提供绝对路径:--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);只有简单的字符串。


推荐阅读