如何在Snakemake的shell指令中延迟评估计算节点本地环境变量?
PBS集群下Snakemake利用节点本地临时目录的问题与解决方法
问题描述
- PBS集群为每个提交的作业创建节点本地临时目录,作业执行期间
$TMPDIR环境变量会被设为该目录路径,作业结束后临时目录自动删除。 - Snakemake在登录节点生成作业脚本(后续通过
qsub提交至PBS)时,临时目录尚未创建,导致无法借助该目录实现高效作业分组,只能通过NFS来回读写文件。 - 曾尝试使用
shadow功能并将shadow-dir设为$TMPDIR,但$TMPDIR的正确值仅在PBS解析作业脚本后才会被设置,因此该配置无法生效。
解决方案
方法1:自定义PBS作业模板
创建自定义的PBS作业模板文件,在模板中添加环境变量导出语句,让Snakemake的shadow目录指向$TMPDIR:
# PBS作业模板内容示例 #PBS -N {rule} #PBS -l nodes=1:ppn={threads} # ... 其他PBS参数 ... export SNAKEMAKE_SHADOW_DIR=$TMPDIR {exec_job}
调用Snakemake时使用--shadow参数,无需指定shadow-dir,Snakemake会自动读取SNAKEMAKE_SHADOW_DIR环境变量作为shadow目录。
方法2:利用--shadow-prefix参数
在启动Snakemake时,指定--shadow-prefix $TMPDIR,同时确保PBS在作业执行时能正确解析这个变量。可以通过转义变量避免登录节点提前解析,让PBS节点端处理:
snakemake --cluster "qsub -l nodes=1:ppn={threads}" --shadow --shadow-prefix \$TMPDIR
方法3:在Rule中单独配置(不推荐)
如果仅针对特定rule优化,可以在rule的shell命令开头先确认$TMPDIR存在,然后将临时文件路径指向该目录:
rule example_rule: input: "input.txt" output: "output.txt" shell: """ if [ -d "$TMPDIR" ]; then cp {input} $TMPDIR/ # ... 此处添加任务处理命令 ... cp $TMPDIR/result {output} fi """
这种方法需要逐个修改rule,适合小范围场景,不建议全局使用。
内容的提问来源于stack exchange,提问作者dev
相关产品推荐
相关产品推荐

