Snakemake中call_variants规则报139错误,直接执行命令正常
解决Snakemake调用xAtlas时随机出现Segmentation Fault(退出码139)的问题
问题场景
- Snakemake脚本
snakefile.py包含all、call_variants等6条规则,仅call_variants规则调用xAtlas变异检测工具时出现随机错误 - 47个样本中每次失败的样本不固定,手动执行Snakemake日志中的报错命令可成功完成
- 服务器迁移重装xAtlas后出现此问题,其他变异检测工具脚本无异常
- 多次使用
--keep-going参数执行,需3次才能完成所有样本;失败样本的日志文件仅被截断,无完整报错信息 - 环境:Snakemake v8.30.0、Ubuntu 22.04.3 LTS
可行解决方案
1. 限制xAtlas任务的资源分配,避免并行资源竞争
随机段错误大概率是多任务并行时内存/CPU资源不足导致,手动单进程执行时资源充足所以无问题。
- 在
call_variants规则中显式指定资源限制(根据xAtlas实际需求调整数值):rule call_variants: input: "input/{sample}.bam" output: "output/{sample}.vcf" resources: mem_mb=16000, # 按需加大内存分配 threads=4 shell: """ xAtlas call --input {input} --output {output} --threads {threads} """ - 执行Snakemake时限制总并行任务数,避免服务器资源过载:
snakemake --printshellcmds -s snakefile.py --jobs 4
2. 重新验证xAtlas的安装完整性与依赖
迁移服务器后重装的xAtlas可能存在编译不完整或依赖缺失,单进程执行无问题但多进程时触发异常:
- 重新编译xAtlas,确保使用服务器本地的依赖库(如libcurl、zlib、htslib等),避免使用跨环境的预编译包
- 用
ldd $(which xAtlas)检查动态链接库,确认所有依赖库都能正常找到,无缺失或版本不匹配
3. 调整Snakemake执行策略,自动重跑失败任务
无需手动多次执行--keep-going,可让Snakemake自动重跑不完整的任务:
snakemake --printshellcmds -s snakefile.py --jobs 4 --rerun-incomplete --keep-going
若怀疑是并行导致的问题,可先将call_variants设为串行执行验证:给规则加threads=1,执行时用--jobs 1,若不再出错则确认是并行资源冲突问题。
4. 捕获完整错误日志
当前失败样本日志被截断,无法定位xAtlas崩溃原因,可在规则中重定向所有输出到日志文件:
rule call_variants: input: "input/{sample}.bam" output: "output/{sample}.vcf" log: "logs/call_variants/{sample}.full.log" resources: mem_mb=16000, threads=4 shell: """ xAtlas call --input {input} --output {output} --threads {threads} > {log} 2>&1 """
这样即使任务崩溃,日志也会保留崩溃前的所有输出,有助于排查xAtlas的具体问题。
5. 调高系统资源限制
Ubuntu默认的进程数、文件句柄数限制可能导致多进程并行时出错,临时调高限制后再执行:
ulimit -n 65536 # 调高最大文件句柄数 ulimit -u 10240 # 调高最大进程数 snakemake --printshellcmds -s snakefile.py --jobs 4
若有效,可修改/etc/security/limits.conf文件永久调整这些限制。
内容的提问来源于stack exchange,提问作者Sofya Dubovskova
相关产品推荐
相关产品推荐

