【发布时间】:2022-02-16 19:46:10
【问题描述】:
在 bash/slurm 中有没有办法让脚本知道它在哪个节点上运行?
所以我创建了一个名为 wrapCode.sh 的 bash 脚本,我正在监视脚本时间以及它在哪个节点上运行。我知道如何监控脚本时间,但有没有办法在最后回显我所在的节点?
sstat 会这样做,但我需要知道我的工作 ID 是什么,脚本似乎也不知道(或者至少我找不到它)。
【问题讨论】:
在 bash/slurm 中有没有办法让脚本知道它在哪个节点上运行?
所以我创建了一个名为 wrapCode.sh 的 bash 脚本,我正在监视脚本时间以及它在哪个节点上运行。我知道如何监控脚本时间,但有没有办法在最后回显我所在的节点?
sstat 会这样做,但我需要知道我的工作 ID 是什么,脚本似乎也不知道(或者至少我找不到它)。
【问题讨论】:
可以在环境变量 SLURM_JOBID 中找到您的作业的 jobid。 此变量由 SLURM 在您提交作业时自动设置。
至于查找运行作业的节点名称,可以在环境变量 SLURMD_NODENAME 中找到。
变量 SLURM_NODELIST 将为您提供分配给作业的节点列表(除非您跨多个节点运行作业,否则它将只包含一个名称)。
有很多变量包含有关您的工作的信息,请参阅https://slurm.schedmd.com/sbatch.html#lbAH
【讨论】:
在作业输出中写入运行的节点的一种简单但有效且经常使用的方法是添加
srun hostname
到它。作业 id 也可以通过环境变量 SLURM_JOB_ID 从作业脚本中获得;所以你可以使用
sstat -j $SLURM_JOB_ID
在你的 slurm 脚本中获取你想要的信息。
【讨论】:
cat $PBS_NODEFILE > machinefile,这将创建一个包含所有节点名称的 machinefile。
SLURM_JOB_NODELIST 保存节点列表。 (不是包含节点列表的文件的路径)
srun hostname > machinefile 也会创建正确的机器文件。如果每个节点指定了多个进程,它也会打印多行。
当您向网格提交作业时,您总是会收到一条消息,告诉您 JobID。如果您以交互方式执行此操作,您将看到如下内容:
$ sbatch wrapCode.sh
Submitted batch job 106
因此,您可以编写一个简单的包装器 bash 脚本来执行作业提交并为您获取 JobID。之后,您可以使用scontrol 命令获取有关作业(包括节点)的详细信息,如下所示:
#!/bin/bash
Command="sbatch wrapCode.sh"
Submit_Output="$($Command 2>&1)"
JobId=`echo $Submit_Output | grep 'Submitted batch job' | awk '{print $4}'`
echo $JobId
# --> Sleep here for a few seconds to wait until the job is actually launched
Host=`scontrol show job $JobId | grep ' NodeList' | awk -F'=' '{print $2}'`
echo $Host
【讨论】:
从以前的答案中知道作业 id,您还可以在终端中使用 sacct 来获取分配给您的作业的资源,包括节点名称:
sacct -j JOB_ID --format=JobID,Start,End,Elapsed,NCPUS,NodeList,NTasks
【讨论】: