Существует ли программа, которая может отправить мне уведомление по электронной почте после завершения процесса?

46

Я ученый в области вычислений, и я выполняю много длительных вычислений в Linux. В частности, я запускаю моделирование молекулярной динамики (MD) с использованием пакета GROMACS. Это моделирование может занять несколько дней или недель, например, на 8–24 ядрах. У меня есть доступ к нескольким узлам кластера, что означает, что в любой момент времени я запускаю приблизительно 4 или 5 заданий (каждое на другом узле и каждое на 8-24 ядрах).

Проблема в том, что моделирование занимает переменное количество времени. Мне нравится, чтобы все узлы работали над симуляциями круглосуточно, но чтобы начать новое моделирование, мне нужно войти в систему с помощью терминала и выполнить некоторую ручную работу. Но я всегда забываю, сколько времени осталось в симуляции, поэтому я всегда заканчиваю тем, что постоянно проверяю их.

Есть ли способ получить электронное письмо, когда процесс Linux завершится? Может ли быть программа для Linux, которая делает это? Таким образом, я бы знал, когда войти в систему с терминала и подготовить следующую симуляцию.

Я использую Ubuntu Linux. Спасибо за ваше время.

Андрей
источник
3
Это было довольно длинное и неуместное описание простого вопроса, который уже был описан в названии. Ты всегда так делаешь?
Acumenus
5
@ABB Как ученый, я считаю, что в «длинном и нерелевантном» описании есть полезная информация. Например, мы знаем, что требуется ручная работа терминала, и, следовательно, есть причина задать вопрос. Кроме того, у нас есть некоторое представление о том, что делает ОП, поэтому мы не думаем полностью в темноте и поэтому можем предоставить дополнительную информацию, которая не запрашивается в вопросе, но может быть полезной или интересной.
user3728501

Ответы:

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. Функциональный sendmailМТА

Большинство систем не имеют проблем с этими требованиями, но стоит проверить.

Джоди С
источник
49

Да, есть

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

Где -s "текст" - тема, эхо дает почте некоторый текст для отправки вам.

Бонси Скотт
источник
4
Команда mailтребует, чтобы локальный MTA был правильно настроен. Это легкое и простое решение.
Иордания
6
Вы также можете использовать, mailчтобы отправить вам вывод команды:{ command; echo Done; } | mail -s "subject" recipient@example.com
Гленн Джекман
4
@ Андрей Имейте в виду, что для того, чтобы это работало, терминал / оболочка, в которой вы запускали оригинальную команду, должен оставаться открытым. Это может быть не сложно, если вы используете что-то вроде screenили tmux, но может быть обидно, когда терминал открыт где-то на несколько дней / недель без него. Решение с atдля управления заданиями будет также заботиться об этой проблеме.
Калеб
@Caleb Не можете ли вы добавить &в конце команды, чтобы заставить его работать в фоновом режиме . sleep 30 && echo "Process done" | mail -s "Process done" mail@domain.tld &
Тео Кузелис
@ Нет, ты не можешь. Даже в фоновом режиме процесс все еще является дочерним элементом вашей оболочки, и если оболочка умирает, дочерний процесс получит сигнал уничтожения. Вы можете использовать, nohupчтобы отсоединить их, но вы также потеряете способность продолжать контролировать его из оболочки. Это частично для чего tmux. Он отделяет запущенные процессы от вашего активно подключенного и просматриваемого сеанса терминала, в то же время позволяя вам нормально взаимодействовать с ними.
Калеб
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

Arun

user1678213
источник
5

Я написал process_watcher.py

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

В настоящее время тело письма выглядит так:

PID 18851: /usr/lib/libreoffice/program/soffice.bin --writer --splash-pipe = 5
Начало работы: чт, 10 марта 18:33:37 Завершено: чт, 10 марта 18:34:26 (продолжительность 0 : 00: 49)
Память (текущая / максимальная) - Резидент: 155 280/155 304 КБ Виртуальный: 1 166 968/1 188 216 КБ

[+] 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'.
Конрад Рудольф
1

У меня есть доморощенный сценарий, который работает для меня. Использование:

mail-after <your command>

Он отправит электронное письмо со значимой информацией по теме и с выводом процесса в теле.

Инструкции по установке находятся на главной странице репозитория GitHub - в настоящее время для всех сценариев создается символическая ссылка ~/bin.

krlmlr
источник
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 готово" | mail -s "процесс завершен" mail@example.com
marlar
0

Несколько лет назад я создал этот псевдоним (в csh я теперь использую его в tcsh):

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

Он требует, чтобы он Mailбыл установлен и работал в вашей системе, но имеет то преимущество, что ваша команда запускается точно так же, как и из командной строки (включая псевдонимы, расширения тильды и т. Д.) - когда вы запускаете задание с использованием atили cronзапускается по умолчанию окружение, которое может быть достаточно различным, чтобы вызвать сбой вашего скрипта или предоставить необычный вывод (меня это укусило cronмного раз)

barrycarter
источник