0

我有一个 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

4 回答 4

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
于 2013-09-08T03:56:14.727 回答
0

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

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

于 2013-09-08T18:01:47.480 回答
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 能做的几乎所有事情,还有更多有用的事情。

于 2013-09-08T22:08:38.743 回答
0

获得它的一种方法是指示 make 忽略来自长时间运行的程序的错误。这可以通过运行来实现,也可以通过在make -i每个应该忽略失败的命令前面加上破折号并运行 plain来实现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 手册

于 2014-08-28T21:53:19.667 回答