Nextflow中截断gzip压缩fastq文件报错141如何解决?
Nextflow实现gzip压缩fastq文件截断的正确方案
错误原因说明
- 错误码141:本质是管道SIGPIPE信号导致的退出码。
head命令取满90万行后会提前终止进程,此时上游还在写入数据的zcat进程会收到SIGPIPE信号,退出码为141。Nextflow执行脚本时默认开启pipefail选项,管道中任意命令返回非0值都会判定整行命令执行失败,因此进程报错退出。 - 直接用
sed -i处理gzip文件的写法完全错误:sed默认无法识别gzip压缩的二进制格式,直接编辑会导致输出文件完全损坏无法使用。
正确进程实现
process TRUNCATE_FASTQ { input: set val(sample), val(single_end), path(reads) from ch_reads output: path "truncated_*.fastq.gz" into ch_output script: def read_files = single_end ? [reads[0]] : reads """ <% read_files.each { read -> %> # 处理${read},仅当非141错误码时抛出异常 zcat ${read} | head -n 900000 | gzip -c > truncated_${read} exit_code=\$? if [ \$exit_code -ne 0 ] && [ \$exit_code -ne 141 ]; then exit \$exit_code fi <% } %> """ }
方案说明
- 兼容单端、双端测序数据:通过输入的
single_end参数自动判断需要处理的文件数量 - 异常处理逻辑:仅忽略正常截断产生的141错误码,其他真实错误(如压缩文件损坏、zcat不可用等)仍然会抛出,保证流程可靠性
- 一步完成解压、截断、重新压缩:不需要生成中间未压缩文件,减少磁盘IO开销
- 自动适配文件大小:如果原文件行数不足90万行,
head会读取全部内容后正常退出,zcat返回0,不会做多余修改,符合需求
内容的提问来源于stack exchange,提问作者Cris Tuñí
相关产品推荐
相关产品推荐

