Bash 在“make”完成后发送电子邮件,即使失败

Bash 在“make”完成后发送电子邮件,即使失败,bash,makefile,Bash,Makefile,我有一个Makefile,它组织了必须按特定顺序运行的几个分析步骤。分析需要相当长的时间(一两天),我希望在make完成时收到一些电子邮件通知。是否有一种好方法可以让make在流程结束时自动发送电子邮件,以便在流程完成时收到提醒,尤其是其中一个步骤出现故障时 我目前正在做这样的事情: # Makefile all: results1.dat results2.dat results3.dat python send_email_when_done.py results1.dat: lo

我有一个Makefile,它组织了必须按特定顺序运行的几个分析步骤。分析需要相当长的时间(一两天),我希望在
make
完成时收到一些电子邮件通知。是否有一种好方法可以让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
#生成文件
全部:结果1.dat结果2.dat结果3.dat
python在完成时发送电子邮件
结果1.dat:long_running_program 1.py
python$<>$@#这需要约12个小时
结果2.dat:长时间运行的程序1.py结果1.dat
python$^>$@#这需要约2个小时
结果2.dat:长时间运行的程序1.py结果2.dat
python$^>$@#这需要约30个小时
其中,
send\u email\u when\u done.py
脚本在流程完成时发送电子邮件通知。但这只有在整个过程从头到尾都没有出现任何错误的情况下才有效。有什么好的建议吗


+1获取可在
Makefile
中完成此操作的建议。我已经在一个单独的会话中运行了
make
,使用
setsid make>make.out 2>&1

将电子邮件作为单独的目标发送怎么样:

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

sendmail:
    python send_email_when_done.py

让我把它做得更一般一些,这样它就可以为100个其他类似的
make
发送电子邮件。使用alias并将其添加到
bashrc
中,下面是我如何尝试使用
alias
命令
makes
make
s
结束报告)。另外一个好处是,不管您是否担心规则和依赖性,您都可以打印所有的
详细的
。您可以将其用于所有构建,而无需真正更改
makefile

注意:我使用了mailx,您可以在您的机器上阅读设置mailx,因为它允许您访问底层解释器,所以您可以执行一些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 <&-";
  }
}
perl{
结束{

系统“mail-s”的构建已完成,rc=$?”me@my.home一种方法是指示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
#生成文件
全部:结果1.dat结果2.dat结果3.dat
python在完成时发送电子邮件
结果1.dat:long_running_program 1.py
-python$<>$@#这需要约12个小时
结果2.dat:长时间运行的程序1.py结果1.dat
-python$^>$@#这需要约2个小时
结果2.dat:长时间运行的程序1.py结果2.dat
-python$^>$@#这需要约30个小时
有关忽略错误的详细信息,请参阅。

这里可能有一个想法:
# 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