是否有程序可以在过程完成后向我发送通知电子邮件?


46

我是一名计算科学家,并且在Linux上运行了大量冗长的计算。具体来说,我使用GROMACS软件包运行分子动力学(MD)模拟 这些仿真可能需要几天或几周的时间,才能在(例如)8至24个内核上运行。我可以访问群集的多个节点,这意味着在任何给定时间,我都在运行大约4或5个作业(每个作业在不同的节点上,每个作业在8-24个内核上)。

问题在于模拟需要花费可变的时间。我想让所有节点全天候进行仿真,但是要开始新的仿真,我需要使用终端登录并做一些手动工作。但是我总是忘记模拟中还剩下多少时间,因此我总是不断地检查它们。

Linux进程完成后,有什么方法可以接收电子邮件?会有Linux程序可以执行此操作吗?这样,我将知道何时使用终端登录并准备下一个模拟。

我正在使用Ubuntu Linux。谢谢你的时间。


3
对于一个已经在标题中涵盖的简单问题,这是一个相当长且无关紧要的描述。你总是这样吗?
Acumenus 2014年

5
@ABB作为科学家,我认为“冗长且无关紧要”的描述中会提供有用的信息。例如,我们知道需要手动终端工作,因此有一个提出问题的原因。另外,我们对OP的操作有所了解,因此我们不会完全在黑暗中思考,因此可能能够提供问题中未要求但可能有用或感兴趣的其他信息。
user3728501 2016年

Answers:


30

提交到at守护程序的作业将在完成后从stderr和stdout发送任何输出给您。即使作业没有输出,也可以将其配置为发送邮件。它还具有无需控制终端即可运行的优势,因此您不必担心关闭终端会对工作产生影响。

例:

echo "/opt/product/bin/job.sh data123"|at -m NOW

作业完成后,提交作业的用户将收到一封电子邮件,如果有任何输出,您将收到它。您可以通过更改LOGNAME环境变量来更改电子邮件收件人。

at具有批处理模式,您可以在系统不忙时将作业排队运行。当多个用户争用资源时,这不是一个很好的排队系统,但是,如果您想使用它来运行作业,则:

echo "/opt/product/bin/job.sh dataA"|batch
echo "/opt/product/bin/job.sh dataB"|batch
echo "/opt/product/bin/job.sh dataC"|batch

默认情况下,除非系统负载低于1.5,否则作业不会启动,但是可以调整负载数字(并且我应该说使用24核)。如果它们没有将loadavg超出负载限制(再次为默认值1.5),它们可以并行运行,或者如果它们各自将loadavg超过1.5,则它们将串行运行。

您可以使用来查看作业队列atq,并使用来删除作业atrm

答案依赖性:

  1. 正在运行的atd守护程序(ps -ef|grep atd
  2. 您可以将作业提交到atd(不被/etc/at.deny/ /etc/at.allow配置拒绝)
  3. 功能性sendmailMTA

大多数系统在这些要求上都没有问题,但是值得检查。


49

是的,有

command; echo "Process done" | mail -s "Process done" mail@domain.tld

其中-s“文本”为主题,回显为邮件提供一些文本发送给您。


4
mail命令确实要求正确配置本地MTA。这是简单的解决方案。
jordanm 2012年

6
您还可以使用mail以下命令向您发送命令的输出:{ command; echo Done; } | mail -s "subject" recipient@example.com
glenn jackman 2012年

4
@Andrew请注意,要使此功能正常运行,您在原始终端中运行的原始命令必须保持打开状态。如果使用类似screen或的方法tmux,这可能并不难,但如果没有终端,则可能需要几天/几周才能在某个地方打开终端,这很麻烦。用于作业管理解决方案at也可以解决该问题。
Caleb

@Caleb不能&在命令末尾添加a ,以使其在后台运行。sleep 30 && echo "Process done" | mail -s "Process done" mail@domain.tld &
Theo Kouzelis 2015年

@Theo不,你不能。即使在后台,该进程仍然是您的外壳程序的子进程,如果外壳程序死亡,则该子进程将收到终止信号。您可以使用nohup断开其链接,但你也失去了继续从壳控制的能力。这部分tmux是为了。它使正在运行的进程与处于活动状态的已连接并已查看的终端会话分离开来,同时仍然允许您与它们进行正常交互。
卡雷布(Caleb)2015年

7

我建议设置一个python脚本来发送电子邮件,它们很容易为您使用的任何服务编写和配置正确的邮件服务器。他们看起来像这样:

#!/usr/bin/python

import smtplib

sender = 'from@fromdomain.com'
receivers = ['to@todomain.com']

message = """From: From Person <from@fromdomain.com>
To: To Person <to@todomain.com>
Subject: SMTP e-mail test

This is a test e-mail message.
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

将此功能与其他答案中建议的管道操作员结合使用。

我发现这个问题的另一个很好的解决方案是使用Pushover。Pushover-“ Pushover使您可以轻松地向您的Android和iOS设备发送实时通知。” 我设置了一个简单的脚本,该脚本在构建完成后就使用了简单的API来向手机发送消息。

curl -s \
  -F "token=APP_TOKEN" \
  -F "user=USER_KEY" \
  -F "message=The build is done." \
  https://api.pushover.net/1/messages.json

6

您还可以使用 trap命令在进程退出时,中断,挂起或进程终止时发送邮件。这是您必须放在脚本顶部的代码。

    trap 'mail -s "Process done" mail@domain.tld' exit # It will mail on normal exit
    trap 'mail -s "Process interrupted" mail@domain.tld' INT HUP# it will mail on interrupt or hangup  of the process

阿伦


5

我写了process_watcher.py

process_watcher --pid 1234 --to me@gmail.com

目前,电子邮件正文如下所示:

PID 18851:/usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
开始:3月10日星期四18:33:37结束:3月10日星期四18:34:26(持续时间0 :00:49)
内存(当前/峰值)-驻留:155,280 / 155,304 kB虚拟:1,166,968 / 1,188,216 kB

[+] indicates the argument may be specified multiple times, for example:
 process-watcher -p 1234 -p 4258 -c myapp -c "exec\d+" --to person1@domain.com --to person2@someplace.com

optional arguments:
  -h, --help            show this help message and exit
  -p PID, --pid PID     process ID(s) to watch [+]
  -c COMMAND_PATTERN, --command COMMAND_PATTERN
                        watch all processes matching the command name. (RegEx pattern) [+]
  -w, --watch-new       watch for new processes that match --command. (run forever)
  --to EMAIL_ADDRESS    email address to send to [+]
  -n, --notify          send DBUS Desktop notification
  -i SECONDS, --interval SECONDS
                        how often to check on processes. (default: 15.0 seconds)
  -q, --quiet           don't print anything to stdout

如果需要任何改进,请停止GitHub问题。


2
对我来说是赢家,因为它可以通过PID附加到已经在运行的进程中。
joseph_morris

1
@joseph_morris我也喜欢这个脚本,但是为了完整起见,您可以通过发出命令轻松地附加到正在运行(通过Ctrl-Z暂停)的进程,而无需该帮助程序fg ‹PID›; mail -s Completed to@example.com <<< 'Message here'
Konrad Rudolph

1

我有一个适合我的自家脚本。用法:

mail-after <your command>

它将发送一封电子邮件,其中包含有关主题的有意义的信息,并将过程的输出显示在正文中。

安装说明位于GitHub存储库的主页上 -当前,所有脚本都在其中创建了符号链接~/bin


1

假设您的程序已经在运行,请使用bash + pgrep进行观看。

# Check that "pgrep $PROGRAM" returns the rid PID.
PROGRAM=foo
RECIPIENTS=you@yours.com
echo Watching $PROGRAM; while pgrep $PROGRAM &>/dev/null ; do sleep 1; echo -ne "."; done ; echo "$PROGRAM process done" | /bin/mail -s "$PROGRAM process done" $RECIPIENTS;

我使用了类似的东西:while [[$(pgrep myprog)]]; 睡60 完成 回显“ myprog已完成” | 邮件-s“处理完成” mail@example.com
marlar

0

多年以前,我创建了这个别名(在csh中,现在在tcsh中使用它):

alias shunt "( \!* | Mail -s 'Output of: \!*' $user) >& /dev/null &"

它要求Mail在系统上安装并正常工作,但具有以下优势:当使用atcron在默认情况下运行作业时,命令的运行与命令行中的运行完全相同(包括别名,波浪号扩展等)。可能足以导致脚本失败或提供异常输出的环境(我已经被cron很多次所困扰)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.