使用SLURM时,如何在Snakemake工作流完成后发送邮件?
在Snakemake结合SLURM时实现工作流全局邮件通知
要实现仅在整个工作流完成/失败时发送邮件,而非每个规则作业都发,可通过以下两种方式实现:
方法一:利用SLURM主作业的邮件通知
当使用--slurm运行Snakemake时,会生成一个主SLURM作业负责调度所有子规则作业。我们只需给这个主作业配置邮件通知,子作业不添加相关设置即可:
- 移除子作业SLURM脚本中的
#SBATCH --mail-type=END,FAIL配置,避免每个规则发邮件。 - 运行Snakemake时,通过
--slurm-extra参数给主作业添加邮件选项:
snakemake --slurm --slurm-extra "--mail-type=END,FAIL --mail-user=example@hello.com"
这样主作业会在整个工作流完成(成功或失败)时触发邮件,子作业不会发送任何邮件。
方法二:结合Snakemake全局onsuccess/onerror自定义邮件内容
如果需要自定义邮件标题、正文等内容,可使用Snakemake的全局钩子结合自定义脚本:
- 编写一个邮件发送脚本(示例用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)
- 在Snakefile中添加全局钩子:
onsuccess: shell("python send_email.py example@hello.com 'Snakemake工作流xxx成功完成' '所有任务已执行完毕,工作流结束'") onerror: shell("python send_email.py example@hello.com 'Snakemake工作流xxx执行失败' '工作流执行过程中出现错误,请检查日志'")
- 运行Snakemake时需加上
--wait参数,让主进程等待所有SLURM作业完成后执行钩子:
snakemake --slurm --wait
注意事项
- 若不加
--wait,Snakemake主进程会在提交完所有作业后直接退出,无法触发onsuccess/onerror钩子。 - 确保邮件脚本的SMTP配置正确,且运行Snakemake的节点能访问SMTP服务器。
内容的提问来源于stack exchange,提问作者justinian482
相关产品推荐
相关产品推荐

