在'make`完成后发送电子邮件,即使失败也是如此

时间:2013-09-08 00:29:19

标签: bash makefile

我有一个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内完成此操作的建议。我已使用make在单独的会话中运行setsid make > make.out 2>&1

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

注意:我使用mailx,你可以阅读this来设置你机器上的mailx

答案 2 :(得分:0)

由于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 <&-";
  }
}

makepp还有很多。除了做几乎所有GNU make之外,还有更多有用的东西。

答案 3 :(得分:0)

获得这种方法的一种方法是指示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 make manual