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

使用SLURM时,如何在Snakemake工作流完成后发送邮件?

在Snakemake结合SLURM时实现工作流全局邮件通知

要实现仅在整个工作流完成/失败时发送邮件,而非每个规则作业都发,可通过以下两种方式实现:

方法一:利用SLURM主作业的邮件通知

当使用--slurm运行Snakemake时,会生成一个主SLURM作业负责调度所有子规则作业。我们只需给这个主作业配置邮件通知,子作业不添加相关设置即可:

  1. 移除子作业SLURM脚本中的#SBATCH --mail-type=END,FAIL配置,避免每个规则发邮件。
  2. 运行Snakemake时,通过--slurm-extra参数给主作业添加邮件选项:
snakemake --slurm --slurm-extra "--mail-type=END,FAIL --mail-user=example@hello.com"

这样主作业会在整个工作流完成(成功或失败)时触发邮件,子作业不会发送任何邮件。

方法二:结合Snakemake全局onsuccess/onerror自定义邮件内容

如果需要自定义邮件标题、正文等内容,可使用Snakemake的全局钩子结合自定义脚本:

  1. 编写一个邮件发送脚本(示例用Python),比如send_email.py:
import smtplib
from email.mime.text import MIMEText
import sys

def send_email(to_addr, subject, body):
    # 替换为你的SMTP服务器配置
    smtp_server = "smtp.example.com"
    smtp_port = 587
    from_addr = "your_notify_email@example.com"
    password = "your_email_password"  # 推荐用应用专用密码

    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = from_addr
    msg['To'] = to_addr

    with smtplib.SMTP(smtp_server, smtp_port) as server:
        server.starttls()
        server.login(from_addr, password)
        server.send_message(msg)

if __name__ == "__main__":
    to_addr = sys.argv[1]
    subject = sys.argv[2]
    body = sys.argv[3]
    send_email(to_addr, subject, body)
  1. 在Snakefile中添加全局钩子:
onsuccess:
    shell("python send_email.py example@hello.com 'Snakemake工作流xxx成功完成' '所有任务已执行完毕,工作流结束'")

onerror:
    shell("python send_email.py example@hello.com 'Snakemake工作流xxx执行失败' '工作流执行过程中出现错误,请检查日志'")
  1. 运行Snakemake时需加上--wait参数,让主进程等待所有SLURM作业完成后执行钩子:
snakemake --slurm --wait

注意事项

  • 若不加--wait,Snakemake主进程会在提交完所有作业后直接退出,无法触发onsuccess/onerror钩子。
  • 确保邮件脚本的SMTP配置正确,且运行Snakemake的节点能访问SMTP服务器。

内容的提问来源于stack exchange,提问作者justinian482

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:10:27