如何将Slurm批处理脚本追加至错误文件并保存到变量
Slurm批处理脚本追加到错误文件及传递脚本内容给主程序的解决方案
一、将脚本追加到错误文件而非覆盖
原命令scontrol write batch_script $SLURM_JOB_ID $error_file会直接覆盖错误文件,要实现追加效果,可通过以下两种方式:
方法1:获取提交时的原始脚本内容并追加
利用scontrol show batch_script获取Slurm存储的提交脚本内容,去掉头部的JobId信息后追加到错误文件:
# 替换原脚本最后一行的scontrol命令 scontrol show batch_script $SLURM_JOB_ID | tail -n +2 >> $error_file
tail -n +2的作用是移除输出第一行的JobId=xxxx BatchScript=前缀,仅保留纯脚本内容。
方法2:直接读取当前脚本文件追加(适用于脚本存于共享存储的场景)
如果作业节点能访问提交时的脚本文件,可直接读取当前脚本内容追加:
cat "$0" >> $error_file
注意:若提交后脚本被修改,此方法会读取修改后的版本,而方法1始终读取提交时的原始脚本。
二、将脚本内容存入变量并传递给main函数
要把脚本内容存入bash变量并传递给主程序,需处理换行和特殊字符问题,推荐两种实现方式:
方式1:直接存入变量传递
获取原始脚本内容存入变量,调用main时作为参数传递:
# 获取提交时的原始脚本内容 script_content=$(scontrol show batch_script $SLURM_JOB_ID | tail -n +2) # 调用main函数,新增--script参数传递脚本内容 $main --opt1 $opt1 --opt2 $opt2 --script "$script_content"
确保main程序能正确解析带换行的字符串参数。
方式2:Base64编码后传递(避免特殊字符转义问题)
若脚本包含引号、反斜杠等特殊字符,可先编码再传递,在main程序中解码还原:
# 对脚本内容进行Base64编码(-w 0表示不换行) script_base64=$(scontrol show batch_script $SLURM_JOB_ID | tail -n +2 | base64 -w 0) # 传递编码后的内容 $main --opt1 $opt1 --opt2 $opt2 --script-base64 "$script_base64"
main程序只需调用Base64解码函数,即可还原原始脚本内容。
内容的提问来源于stack exchange,提问作者Nukesub
相关产品推荐
相关产品推荐

