在“制作”完成后发送电子邮件,即使失败也是如此



我有一个 Makefile,它正在组织几个分析步骤,这些步骤必须按特定顺序运行。分析需要相当长的时间(一两天),我希望在make完成后收到一些电子邮件通知。有没有一种好方法可以让在过程结束时自动发送电子邮件,以便在它完成时收到警报,尤其是在其中一个步骤失败时?

我目前正在做这样的事情:

# Makefile
all: results1.dat results2.dat results3.dat
    python send_email_when_done.py
results1.dat: long_running_program1.py
    python $< > $@ # this takes ~12 hours
results2.dat: long_running_program1.py results1.dat
    python $^ > $@ # this takes ~2 hours 
results2.dat: long_running_program1.py results2.dat
    python $^ > $@ # this takes ~30 hours

send_email_when_done.py脚本在流程完成后发送电子邮件通知。但这只有在整个过程从头到尾运行而没有任何错误时才有效。有什么好方法的建议吗?

+1 表示可以在Makefile内完成此操作的建议。我已经使用 setsid make > make.out 2>&1 在单独的会话中运行make.

如何简单地将电子邮件发送作为单独的目标:

report: long_running_program1.py
    python $< > $@ # this takes ~12 hours
sendmail:
    python send_email_when_done.py

你称之为:

make report sendmail
or
make report ; make sendmail

让我让它更通用,以便它可以为其他 100 个此类make发送电子邮件。使用别名并将其添加到 bashrc 中,这里 sagarsakre.blogspot.in 是我尝试使用 alias 命令makesmakes结束报告)的方式。额外的优势是,无论担心规则和依赖性,您都可以打印所有verbose。您可以将其用于所有构建,而无需真正更改makefile

注意:我使用了 MailX,您可以阅读此内容以在您的机器上设置 mailX

由于 makepp 允许你访问底层解释器,你可以做一些 Perl 编程,在 makefile 中的任何位置添加一个 END-Handler:

perl { END { system "python send_email_when_done.py" }}

或者使用替代的直接主题邮件进行更漂亮的布局

perl {
  END {
    system "mail -s 'Build finished with rc=$?' me@my.home <&-";
  }
}

还有很多事情要做。 除了做几乎所有GNU可以做的事情之外,还有很多更有用的东西。

获得这一点的一种方法是指示 make 忽略长时间运行的程序的错误。这可以通过运行make -i或通过在每个命令前面加上前缀来实现,其中失败应该用破折号忽略并只运行普通make

# Makefile
all: results1.dat results2.dat results3.dat
    python send_email_when_done.py
results1.dat: long_running_program1.py
    -python $< > $@ # this takes ~12 hours
results2.dat: long_running_program1.py results1.dat
    -python $^ > $@ # this takes ~2 hours 
results2.dat: long_running_program1.py results2.dat
    -python $^ > $@ # this takes ~30 hours

请参阅 GNU 制作手册 以获取有关忽略错误的更多信息。

最新更新