如果规则的 shell 命令是集群作业,Snakemake 可以工作吗?

Can Snakemake work if a rule's shell command is a cluster job?

在下面的示例中,如果 shell 脚本 shell_script.sh 向集群发送作业,是否可以让 snakemake 知道该集群作业已完成?也就是说,首先,文件 a 应该由 shell_script.sh 创建,它将自己的作业发送到集群,然后一旦这个集群作业完成,文件 b 应该被创建。

为简单起见,我们假设 snakemake 是 运行 本地的,这意味着唯一的集群作业来自 shell_script.sh 而不是 snakemake 。

localrules: that_job

rule all:
    input:
        "output_from_shell_script.txt",
        "file_after_cluster_job.txt"

rule that_job:
    output:
        a = "output_from_shell_script.txt",
        b = "file_after_cluster_job.txt"
    shell:
        """
        shell_script.sh {output.a}
        touch {output.b}
        """

PS - 目前,我正在使用 sleep 命令在作业 "completed" 之前给它一个等待时间。但这是一个糟糕的解决方法,因为这可能会引起几个问题。

Snakemake 可以使用命令行上的 --cluster 参数为您管理。
您可以为要在集群上执行的作业提供模板。
作为示例,以下是我如何在 SGE 管理的集群上使用 snakemake:

模板,它将封装我调用的作业 sge.sh:

#$ -S /bin/bash
#$ -cwd
#$ -V

{exec_job}

那我直接在登录节点上使用:

snakemake -rp --cluster "qsub -e ./logs/ -o ./logs/" -j 20 --jobscript sge.sh --latency-wait 30

--cluster 将告知使用哪个排队系统
--jobscript 是封装作业的模板
如果文件系统需要一些时间来写入文件,--latency-wait 很重要。您的作业可能会在规则的输出对文件系统实际可见之前 return 结束,这将导致错误

注意在Snakefile中可以通过关键字localrules:

指定不在节点上执行的规则

否则,根据您的排队系统,存在一些等待发送到集群的作业完成的选项:
上金所: Wait for set of qsub jobs to complete
咕噜咕噜:
低频光纤: https://superuser.com/questions/46312/wait-for-one-or-all-lsf-jobs-to-complete