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


46

Я вчений-обчислювач, і багато Linux обчислюю. Зокрема, я запускаю моделювання молекулярної динаміки (MD) за допомогою пакету GROMACS. Ці симуляції можуть тривати дні або тижні, працюючи на (наприклад) від 8 до 24 ядер. У мене є доступ до декількох вузлів кластеру, це означає, що в будь-який момент часу я виконую приблизно 4 або 5 завдань (кожен на іншому вузлі і кожен на 8-24 ядрах).

Проблема полягає в тому, що моделювання займає різну кількість часу. Мені подобається постійно тримати всі вузли, що працюють над моделюванням, але для того, щоб почати нове моделювання, мені потрібно увійти в систему за допомогою терміналу і виконати деяку ручну роботу. Але я завжди забуваю, скільки часу залишилось на моделювання, тому я завжди закінчую їх постійно перевіряти.

Чи є спосіб отримати електронний лист після завершення процесу Linux? Чи може бути програма Linux, яка це робить? Таким чином я би знав, коли потрібно увійти з терміналом і підготувати наступне моделювання.

Я використовую Ubuntu Linux. Дякую за ваш час.


3
Це був досить довгий і неактуальний опис простого питання, яке вже висвітлювалося в назві. Ви завжди це робите?
Акумен

5
@ABB Як вчений, я вважаю, що в описі "довгих і невідповідних" є корисна інформація. Наприклад, ми знаємо, що потрібна робота вручну на терміналі, і тому є питання, щоб задати питання. Крім того, ми маємо деяке уявлення про те, що робить ОП, тому ми не думаємо повністю в темряві і тому можемо надати додаткову інформацію, яка не запитується у запитанні, але може бути корисною чи цікавою.
користувач3728501

Відповіді:


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 ядрами я б сказав, що слід). Вони можуть працювати паралельно, якщо вони не збивають завантажувальну групу понад ліміт завантаження (знову за замовчуванням 1,5), або якщо вони окремо набивають вантажівок понад 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

Якщо "текст" - це тема, ехо надає пошті якийсь Текст для надсилання вам.


4
mailКоманда не вимагає локального MTA повинен бути правильно налаштований. Це легке і просте рішення.
Йорданм

6
Ви також можете скористатися mailдля надсилання результатів команди:{ command; echo Done; } | mail -s "subject" recipient@example.com
glenn jackman

4
@Andrew Будьте в курсі, що для цього, щоб термінал / оболонка працював з початковою командою, повинен залишатися відкритим. Це може не бути складним, якщо ви використовуєте щось подібне screenабо tmux, але може бути дотичним відкриття терміналу десь на дні / тижні без нього. Рішення з atдля управління завданнями буде також дбати про цю проблему.
Калеб

@Caleb Cant ви додаєте a &в кінці команди, щоб змусити його запускатись у задній частині. 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

Арун


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.


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; зроблено; відлуння "мій прог зроблено" | mail -s "процес завершений" mail@example.com
1818

0

Віки тому я створив цей псевдонім (в csh, зараз я його використовую в tcsh):

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

Він вимагає, щоб він Mailбув встановлений і працював у вашій системі, але має перевагу, що ваша команда працює точно так само, як і в командному рядку (включаючи псевдоніми, нахили розширення тощо) - коли ви запускаєте роботу з використанням atабо cronвона працює за замовчуванням оточення, яке може бути досить різним, щоб призвести до виходу з ладу сценарію або надання незвичного виводу (мене укусило cronбагато разів)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.