Snakemake 8.28+Slurm插件如何设置Slurm任务名为规则/样本名?
解决Snakemake v8.x搭配Slurm插件自定义任务名的问题
问题背景
我正在使用Snakemake v8.28搭配snakemake-executor-plugin-slurm插件将工作流提交至Slurm调度器,默认Slurm任务名是无意义的哈希字符串,希望将sbatch/srun调用的--job-name参数设为规则名,或者更理想的规则名+样本名组合。
之前在profile的config.yaml里尝试如下配置:
#Cluster configuration executor: slurm default-resources: slurm_partition: "mypartition" slurm_account: "myaccount" cpus_per_task: 2 mem_mb_per_cpu: 7500 runtime: 30 slurm_extra: "--job-name={rule}"
结果触发报错:
Error: WorkflowError: Failed to evaluate resources value '--job-name={rulename}'. String arguments may need additional quoting. E.g.: --default-resources "tmpdir='/home/user/tmp'" or --set-resources "somerule:someresource='--nice=100'". This also holds for setting resources inside of a profile, where you might have to enclose them in single and double quotes, i.e. someresource: "'--nice=100'".
试过多种引号组合仍无法解决,而在Snakemake ~7.19版本中,我曾通过--cluster搭配PBS实现类似需求:
snakemake \ --cluster "qsub \ -q myqueue -l select=1:ncpus={threads}:mem=16GB \ -N {rule} \ -o {log} -j oe"
解决方案
在Snakemake v8.x的Slurm插件体系中,不能直接通过slurm_extra硬编码规则或通配符变量,需要改用以下两种方式实现:
方法1:资源函数(支持规则名+样本通配符)
在profile的config.yaml中,将slurm_extra定义为带参数的lambda函数,动态生成任务名:
executor: slurm default-resources: slurm_partition: "mypartition" slurm_account: "myaccount" cpus_per_task: 2 mem_mb_per_cpu: 7500 runtime: 30 slurm_extra: "lambda wildcards, rule: f'--job-name={wildcards.sample}.{rule.name}'"
- 若不需要样本名,可简化为:
lambda rule: f'--job-name={rule.name}' - 函数会自动接收当前任务的
wildcards(通配符集合)和rule(规则对象),实现动态拼接。
方法2:专用资源项(仅支持规则名)
Slurm插件提供了slurm_job_name专用资源项,可直接设置规则名:
executor: slurm default-resources: slurm_partition: "mypartition" slurm_account: "myaccount" cpus_per_task: 2 mem_mb_per_cpu: 7500 runtime: 30 slurm_job_name: "{rule.name}"
这种方式更简洁,但无法结合通配符(如样本名),适合仅需规则名的场景。
规则级定制
如果个别规则需要单独定制任务名,可在规则的resources字段中覆盖全局配置:
rule process_sample: input: "raw/{sample}.fastq" output: "processed/{sample}.bam" resources: slurm_extra: "lambda wildcards, rule: f'--job-name={wildcards.sample}.{rule.name}.custom'" shell: "process_script {input} {output}"
内容的提问来源于stack exchange,提问作者Sean Taylor
相关产品推荐
相关产品推荐

