使用Slurm --wrap提交脚本时,如何获取Job ID并写入日志?
解决Slurm --wrap中获取Job ID并记录运行时间的问题
问题原因分析
%A在--wrap中无效:Slurm的%A占位符仅会替换sbatch命令行中直接指定的参数(比如-o日志文件名里的占位符),不会解析--wrap内部的%A。作业运行时,%A会被当作普通字符串传递给squeue,自然报无效Job ID错误。- 未转义的
$SLURM_JOBID失效:如果用双引号包裹--wrap内容,提交作业的shell会先展开$SLURM_JOBID——此时作业还未创建,这个变量是空值,导致squeue没有指定具体Job ID,从而返回所有活跃作业的运行时间。
正确解决方案
核心思路是让$SLURM_JOBID在作业运行时被Slurm的环境变量替换,而非提交时被shell展开,以下是两种可行写法:
方法1:用单引号包裹--wrap内容
单引号会阻止shell展开内部变量,作业运行时Slurm会自动设置$SLURM_JOBID环境变量,此时就能正确获取当前Job ID:
sbatch \ -J nom \ --mem=16G \ -c 4 \ -t 24:00:00 \ -p partition \ -A acount \ -o %A_scriptname_%x.log \ --wrap 'echo "hello world"; squeue -j $SLURM_JOBID --Format=TimeUsed'
方法2:转义双引号内的$符号
如果需要在--wrap中使用双引号,给$SLURM_JOBID的$加反斜杠转义,避免提交时被shell展开:
sbatch \ -J nom \ --mem=16G \ -c 4 \ -t 24:00:00 \ -p partition \ -A acount \ -o %A_scriptname_%x.log \ --wrap "echo 'hello world'; squeue -j \$SLURM_JOBID --Format=TimeUsed"
内容的提问来源于stack exchange,提问作者dragon951
相关产品推荐
相关产品推荐

