You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:53:11