linux - slurm SBATCH - 多个节点,相同的 SLURMD_NODENAME

标签 linux bash hpc slurm

  • slurm-wlm 17.11.2
  • 从 Ubuntu Apt 存储库安装,Ubuntu:18.04

我们有一个由 20 个相同节点组成的集群。 运行下面的简单脚本给我带来了一个令人困惑的问题。 所有作业都认为它们在 node3 上运行,而运行 hostname 命令给出了准确的答案。这也是输出文件名的问题。我希望有许多不同的输出,但我只得到一个,文件名中带有“node3”。这似乎是 Bash Eval()/变量替换错误。 包装

SLURMD_NODENAME

在一个

bash -c "echo Bash3: \$SLURMD_NODENAME"

有效。但为什么我必须这样做?

中国.job:

#!/bin/bash
#SBATCH --output=/share/output.txt.%j.%J.%a.%A.%n.%N.%s.%t.%x

#SBATCH --time=00:00:30
#SBATCH --tasks-per-node=2
#SBATCH --nodes=4

srun hostname
srun bash -c "echo Bash2: \$(hostname)"
srun echo SLURMD_NODENAME:$SLURMD_NODENAME SLURM_ARRAY_TASK_ID:$SLURM_ARRAY_TASK_ID SLURM_ARRAY_JOB_ID:$SLURM_ARRAY_JOB_ID SLURM_JOB_ID:$SLURM_JOB_ID SLURM_TASK_PID:$SLURM_TASK_PID
srun bash -c "echo Bash3: \$SLURMD_NODENAME"

srun sleep 20

跑起来像:

sbatch cn.job

产生这个输出:

/share/output.txt.2056.2056.4294967294.2056.0.node3.4294967294.0.cn.job

node3
node3
node6
node4
node5
node6
node4
node5
Bash2: node3
Bash2: node6
Bash2: node4
Bash2: node5
Bash2: node3
Bash2: node4
Bash2: node6
Bash2: node5
SLURMD_NODENAME:node3 SLURM_ARRAY_TASK_ID: SLURM_ARRAY_JOB_ID: SLURM_JOB_ID:2056 SLURM_TASK_PID:6441
SLURMD_NODENAME:node3 SLURM_ARRAY_TASK_ID: SLURM_ARRAY_JOB_ID: SLURM_JOB_ID:2056 SLURM_TASK_PID:6441
SLURMD_NODENAME:node3 SLURM_ARRAY_TASK_ID: SLURM_ARRAY_JOB_ID: SLURM_JOB_ID:2056 SLURM_TASK_PID:6441
SLURMD_NODENAME:node3 SLURM_ARRAY_TASK_ID: SLURM_ARRAY_JOB_ID: SLURM_JOB_ID:2056 SLURM_TASK_PID:6441
SLURMD_NODENAME:node3 SLURM_ARRAY_TASK_ID: SLURM_ARRAY_JOB_ID: SLURM_JOB_ID:2056 SLURM_TASK_PID:6441
SLURMD_NODENAME:node3 SLURM_ARRAY_TASK_ID: SLURM_ARRAY_JOB_ID: SLURM_JOB_ID:2056 SLURM_TASK_PID:6441
SLURMD_NODENAME:node3 SLURM_ARRAY_TASK_ID: SLURM_ARRAY_JOB_ID: SLURM_JOB_ID:2056 SLURM_TASK_PID:6441
SLURMD_NODENAME:node3 SLURM_ARRAY_TASK_ID: SLURM_ARRAY_JOB_ID: SLURM_JOB_ID:2056 SLURM_TASK_PID:6441
Bash3: node3
Bash3: node5
Bash3: node3
Bash3: node4
Bash3: node6
Bash3: node4
Bash3: node6
Bash3: node5

最佳答案

SLURMD_NODENAME: Name of the node upon which the current job step executes

(来自例如 https://www.nccs.nasa.gov/user_info/slurm/environment_variables/sbatch )

因此,您的 cn.job 文件在分配的上下文中执行,但在任何作业步骤(srun)之前执行。它像常规 bash 文件一样执行,因此变量替换开始将 $SLURMD_NODENAME 替换为在运行批处理脚本的机器上看到的值。然后通过 srun 执行结果,结果如下:

srun echo $SLURMD_NODENAME -> srun echo node3

其他命令都阻止变量扩展并在作业步骤中在计算节点上运行扩展(或主机名命令),因此它们按预期工作。

人们将 srun 视为 super 充电的 ssh。您会注意到 srun hostname && srun $HOSTNAME 的行为就像 ssh node hostname && ssh node $HOSTNAME (显然是对并行执行取模)。

SLURM 的细微差别:SBatch 文件在计算节点上执行。因此,您不会获得与在登录节点上运行 srun 时相同的输出。

对于单输出文件:不确定,但通常一个作业的所有输出都会被收集并放入一个接收器。这是交互式作业的标准输出或 sbatch 的单个输出文件。你从哪里得到占位符?我只知道作业 ID 和数组作业 ID 的 %j %A %a。显然,只创建一个输出文件是有道理的。

关于linux - slurm SBATCH - 多个节点,相同的 SLURMD_NODENAME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51328917/

相关文章:

linux - 使 linux SPLIT 命令与 Mac OS 终端兼容

bash - 当您执行 Ctrl-C 时 BASH 中会发生什么(提示,它不仅仅是发送 SIGINT)

c++ - 如果命令不只是打印结果,而是进入某种交互模式,如何处理 C++ 终端命令执行的输出?

linux - 树莓派温度项目,在树莓派上读取并在远程网络服务器上显示

linux - 命令行(甚至以编程方式)检索图像的一部分

python - PyCOMPSs 应用程序中的奇怪错误 : Script without last "y" not found

ubuntu - 编译期间使用了错误的 gcc 版本

cluster-computing - 并行运行多个串行相关的作业

linux - LD_PRELOAD 在特定文件夹上失败

linux - 允许Wget只下载应用类型的PDF