在 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/

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

我可以在脚本之前传递--chdir,而不是直接执行sbatch test.sh,从而允许我使用$USER。命令看起来像:

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

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

问题-重述

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

为什么%u的行为不像我所期望的那样?

一种解决方案可以将--chdir参数替换为对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(;只有简单的字符串。

最新更新