environment-variables - 在 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
但这并没有解决最初的目标,即制作一个不需要最终用户在害怕终端时想太多的脚本。
问题 - 重述
有没有办法在--chdir
sbatch 标头中使用变量?
为什么%u
不像我预期的那样表现?
解决方案
一种解决方案可能是将--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
);只有简单的字符串。
推荐阅读
- php - Laravel 模型雄辩
- javascript - 如何使用@progress/kendo-react-pdf 导出 PDF 错误?
- python - 用 Python (gekko) 和 m.Equations 制定非线性优化问题
- spring-boot - 连接到在 Spring Boot 应用程序中需要用户名和密码的托管领事时如何指定凭据?
- ios - UIGraphicsImageRenderer 在旋转时呈现零大小的 UIImage
- r - 如何从具有相同列的两个数据框中获取合并的数据框(R)
- assembly - 为什么更改 %rbp 不会使程序集崩溃?
- xml - XML 标记和 HTML 表的属性
- stm32 - 在 STM32f10x 中使用 EEPROM
- symfony - 将反序列化/非规范化实体变成教义代理?