在下面的示例中,如果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
命令在作业完成之前给它一个等待时间"完成"。但这是一个糟糕的解决方法,因为这可能会产生一些问题。
答案 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:
否则,根据您的排队系统,存在一些选项等待发送到群集的作业完成:
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