如何将Snakemake每个作业执行的Shell命令保存至独立日志文件
我来给你几个实用的方案,帮你把Snakemake每个作业的Shell命令保存到独立日志文件里,结合你的示例脚本详细说明:
方案1:用{shellcmd}变量直接记录命令到专属日志
这个方法最简洁,利用Snakemake内置的{shellcmd}变量获取当前作业要执行的Shell命令,直接把命令和执行输出写入对应样本的日志文件。修改你的脚本如下:
samples = ['a', 'b', 'c'] rule all: input: expand('{sample}.done', sample=samples), rule do_stuff: output: '{sample}.done' # 为每个样本指定单独的日志文件,命名可以自定义 log: '{sample}.job.log' shell: """ # 先把要执行的命令写入日志,方便排查 echo "=== Executing command for sample {wildcards.sample} ===" >> {log} echo "{shellcmd}" >> {log} echo "--- Command output ---" >> {log} # 执行命令,并把stdout和stderr都追加到日志 {shellcmd} 2>&1 >> {log} """
运行后,每个样本会生成对应的a.job.log、b.job.log、c.job.log,日志里会清晰记录执行的命令和输出内容,比如a.job.log里的内容大概是:
=== Executing command for sample a === echo a > a.done --- Command output ---
方案2:开启命令追踪并定向日志(类似--printshellcmds)
如果你习惯用--printshellcmds的输出格式,可以在Shell命令里加set -x开启命令追踪(效果和--printshellcmds一致),然后把所有输出定向到日志文件:
samples = ['a', 'b', 'c'] rule all: input: expand('{sample}.done', sample=samples), rule do_stuff: output: '{sample}.done' log: '{sample}.cmd.log' shell: """ # 开启命令追踪,会自动打印每条执行的命令 set -x # 你的业务命令 echo {wildcards.sample} > {output} """ 2>&1 > {log}
如果想同时在终端看到输出(方便实时查看),可以把重定向改成2>&1 | tee {log},这样终端和日志文件都会同步记录内容。
方案3:全局捕获所有命令到单个文件(可选)
如果不需要每个作业独立日志,只是想把所有作业的Shell命令统一保存到一个文件,直接运行Snakemake时用重定向即可:
snakemake --printshellcmds > snakemake_all_commands.log 2>&1
这个命令会把--printshellcmds输出的所有命令都保存到snakemake_all_commands.log文件里,适合全局排查。
内容的提问来源于stack exchange,提问作者dariober
相关产品推荐
相关产品推荐

