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

时间:2018-04-26 04:22:05

标签: pipeline snakemake

在下面的示例中,如果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命令在作业完成之前给它一个等待时间"完成"。但这是一个糟糕的解决方法,因为这可能会产生一些问题。

1 个答案:

答案 0 :(得分:2)

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很重要。您的作业可能会在规则输出实际对文件系统可见之前结束并返回,这将导致错误

请注意,您可以使用关键字localrules:

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

否则,根据您的排队系统,存在一些选项等待发送到群集的作业完成:
SGE: Wait for set of qsub jobs to complete
SLURM: How to hold up a script until a slurm job (start with srun) is completely finished?
LSF: https://superuser.com/questions/46312/wait-for-one-or-all-lsf-jobs-to-complete