Nextflow运行vcftools仅生成.weir.fst文件无.log文件问题求助
问题原因与解决方案
1. 输出文件glob匹配规则错误
你当前process的output定义为path "*.log.*",这个匹配规则要求文件名必须包含.log.(即.log后面紧跟一个点和其他字符):
- 匹配:
xxx.log.weir.fst(符合规则,所以能正常捕获) - 不匹配:
xxx.log(纯日志文件,.log后面没有其他字符,完全无法被规则命中)
Nextflow只会收集匹配输出规则的文件,未匹配的文件默认不会被发布到publishDir,部分场景下任务完成后也不会在工作目录保留。
2. Nextflow默认严格错误检查导致脚本提前终止
Nextflow默认会在所有任务脚本开头注入set -e配置,只要脚本中任意命令返回非0退出码,整个脚本就会立即终止。而你手动执行bash .command.sh时,默认没有开启该配置,哪怕某一步vcftools运行返回非0(比如出现警告、部分位点被过滤的场景),也会跑完所有步骤,生成全部文件。
3. 重名覆盖风险
如果你的mart输入文件有多行,且不同行的$inicio值相同,后续运行的vcftools会直接覆盖之前生成的.log文件,最终只会保留最后一行对应的日志文件。
修复方案
- 修改output规则,同时匹配两类输出文件:
output: path "*.log" path "*.log.weir.fst"
也可以用单规则匹配两种格式:
output: path "*.log{,.weir.fst}"
- 如果确认vcftools的非0退出码不影响最终结果,可以在脚本开头关闭严格错误检查:
""" set +e while read linea do echo "[DEBUG] working in line: \$linea" inicio=\$(echo "\$linea" | cut -f3) final=\$(echo "\$linea" | cut -f4) cromosoma=\$(echo "\$linea" | cut -f1) segmento=\$(echo "\$linea" | cut -f5) vcftools --vcf ${vcf} \ --weir-fst-pop ${pop_1} \ --weir-fst-pop ${pop_2} \ --out \$inicio.log --chr \$cromosoma \ --from-bp \$inicio --to-bp \$final done < ${mart} """
- 避免重名覆盖,给输出前缀加唯一标识,比如用
$inicio_$cromosoma_$segmento作为输出前缀:
vcftools --vcf ${vcf} \ --weir-fst-pop ${pop_1} \ --weir-fst-pop ${pop_2} \ --out \${inicio}_\${cromosoma}_\${segmento}.log --chr \$cromosoma \ --from-bp \$inicio --to-bp \$final
如果修改后还是无法生成.log文件,可以在vcftools命令末尾添加2>> \${inicio}.log,强制把标准错误输出写入日志文件,避免日志被Nextflow捕获到任务的.stdout/.stderr文件中。
内容的提问来源于stack exchange,提问作者fernanda-miron
相关产品推荐
相关产品推荐

