我有一个 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
命令makes
(make
和s
结束报告)的方式。额外的优势是,无论担心规则和依赖性,您都可以打印所有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 制作手册 以获取有关忽略错误的更多信息。