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

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

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

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

有什么方法可以让我在 Linux 进程完成时收到电子邮件吗?有没有一个 Linux 程序可以做到这一点?这样我就知道何时使用终端登录并准备下一次模拟。

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

答案1

是的

command; echo "Process done" | mail -s "Process done" [email protected]

其中 -s“text” 是主题,回显会向邮件提供一些要发送给您的文本。

答案2

提交给守护进程的作业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 个核心,我认为您应该这样做)。如果它们不将平均负载提高到超过负载限制(再次默认为 1.5),则它们可以并行运行,或者如果它们单独将平均负载提高到超过 1.5,则它们将串行运行。

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

回答依赖关系:

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

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

答案3

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

#!/usr/bin/python

import smtplib

sender = '[email protected]'
receivers = ['[email protected]']

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
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 让您可以轻松地向 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

答案4

我写process_watcher.py

process_watcher --pid 1234 --to [email protected]

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

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 [email protected] --to [email protected]

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 问题。

相关内容