我有一个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
。
答案 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
命令makes
(make
和s
结束报告的方式)。增加的优势是,无论是否担心规则和依赖,你都会打印所有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。