WDL脚本遍历fastq ID文本文件未执行命令问题排查求助
问题排查:WDL脚本未执行预期命令
我需要WDL脚本读取存储fastq文件ID的txt文件,将这些ID代入命令执行。目前脚本运行无报错,但实际命令并未执行。以下是相关代码和文件内容:
原WDL代码
version 1.0 workflow SampleLoop { input { File sampleFile String outputDir Int qualityThreshold Int numProc } call FilterSeq { input: sample = read_lines(sampleFile), outputDir = outputDir, qualityThreshold = qualityThreshold, numProc = numProc } } task FilterSeq { input { Array[String] sample String outputDir Int qualityThreshold Int numProc } command <<< for s in ${sample}; do FilterSeq.py quality -s ${outputDir}/${s}_R1.fq -q ${qualityThreshold} --log ${s}_R1_quality_log --outdir ${outputDir} --nproc ${numProc} done >>> runtime { continueOnReturnCode: true } }
原inputs.json
{ "SampleLoop.outputDir": "~/pipeline/test", "SampleLoop.numProc": "28", "SampleLoop.sampleFile": "~/pipeline/fastqs.txt", "SampleLoop.qualityThreshold": "20" }
fastqs.txt内容
A11-A11_BD801 A11-A11_BD836 A12-A12_BD801 A12-A12_BD836 A13-A13_BD801 A13-A13_BD836 A14-A14_BD801 A14-A14_BD836 A15-A15_BD801 A15-A15_BD836
问题原因及修复方案
1. 数组变量的shell展开错误
WDL中的sample是数组类型,直接用${sample}在shell循环中展开时,WDL会将数组转换为单个空格分隔的字符串,但shell会把整个字符串当作单个循环变量,导致循环未正确遍历每个样本ID。
修复:使用WDL的sep=" "语法将数组元素用空格分隔,确保shell能正确遍历:
for s in ~{sep=" " sample};
2. 输入参数类型不匹配
WDL workflow定义的numProc和qualityThreshold是Int类型,但inputs.json中传入的是带引号的字符串值,可能导致隐性类型错误,影响命令执行。
修复:修改inputs.json中的数值参数为整数类型(去掉引号):
{ "SampleLoop.outputDir": "~/pipeline/test", "SampleLoop.numProc": 28, "SampleLoop.sampleFile": "~/pipeline/fastqs.txt", "SampleLoop.qualityThreshold": 20 }
3. 错误掩盖设置
continueOnReturnCode: true会让任务即使返回非0退出码也标记为成功,可能掩盖FilterSeq.py执行失败的错误,导致看起来命令未执行实际是报错被忽略。
修复:暂时注释或移除该设置,先查看任务日志确认是否有命令执行错误,确认正常运行后再根据需求调整。
修改后的完整WDL脚本
version 1.0 workflow SampleLoop { input { File sampleFile String outputDir Int qualityThreshold Int numProc } call FilterSeq { input: sample = read_lines(sampleFile), outputDir = outputDir, qualityThreshold = qualityThreshold, numProc = numProc } } task FilterSeq { input { Array[String] sample String outputDir Int qualityThreshold Int numProc } command <<< for s in ~{sep=" " sample}; do FilterSeq.py quality -s ${outputDir}/${s}_R1.fq -q ${qualityThreshold} --log ${s}_R1_quality_log --outdir ${outputDir} --nproc ${numProc} done >>> runtime { # continueOnReturnCode: true } }
额外验证步骤
- 检查
outputDir路径是否存在,以及脚本是否有写入权限 - 确认
FilterSeq.py在任务运行环境中可正常调用(可使用绝对路径避免PATH问题) - 查看任务执行日志,确认
FilterSeq.py命令是否被正确生成并执行
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

