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

Следующее, казалось, работало над одним случаем, на котором я протестировал его, и можно просто отбросить имена каталогов как символьные ссылки в ~ / Закладки:

mkdir "$HOME/Bookmarks"
ln -s /tmp "$HOME/Bookmarks/testdir"

function ccd() { cd $(readlink "$HOME/Bookmarks/$1") ; }

ccd testdir && echo $PWD
# gives /tmp
46
12.11.2012, 21:51
8 ответов

Задания, отправленные 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 MTA

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

30
27.01.2020, 19:34

Да, существует

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

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

49
27.01.2020, 19:34
  • 1
    mail команда действительно требует, чтобы локальный MTA был настроен правильно. Это - легкое и простое решение. –  jordanm 10.11.2012, 22:57
  • 2
    можно также использовать mail отправить Вам вывод команды: { command; echo Done; } | mail -s "subject" recipient@example.com –  glenn jackman 11.11.2012, 14:41
  • 3
    @Andrew Действительно знает, что, чтобы это работало терминал/оболочка, в котором Вы выполнили исходную команду, должен остаться открытым. Это не могло бы быть твердо при использовании чего-то как screen или tmux, но это могло бы быть раздражительно, чтобы иметь терминал, открытый где-нибудь в течение дней/недели без него. Решение с at для задания управление также заботилось бы о той проблеме. –  Caleb 14.11.2012, 15:13
  • 4
    @Caleb Вы добавляете a & в конце команды, чтобы заставить это работать в задней земле. sleep 30 && echo "Process done" | mail -s "Process done" mail@domain.tld & –  Theo Kouzelis 26.08.2015, 12:02
  • 5
    @Theo не Вы не можете. Даже в фоновом режиме процесс является все еще ребенком Вашей оболочки и если оболочка умрет, то дочерний процесс получит сигнал уничтожения. Вы могли использовать nohup для удаления связи с ними но Вы также теряете способность продолжить управлять им от оболочки. Это частично что tmux для. Это отделяет рабочие процессы от Вашего активно связанного и просматриваемого терминального сеанса, все еще позволяя Вам обычно взаимодействовать с ними. Сигналы –  Caleb 26.08.2015, 12:20

Я рекомендовал бы установить сценарий 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"

Используйте это в сочетании с оператором канала, предложенным в других ответах.

Другое отличное решение, которое я нашел к этой проблеме, использует Слабого соперника. Слабый соперник - "Слабый соперник помогает отправить уведомления в реальном времени Вашему Android и устройствам на iOS". Я устанавливаю простой сценарий, какой ultised легкий API для отправки сообщения в мой телефон, когда мои сборки сделаны.

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

Можно также использовать trap команда для отправки почты на выходе процесса, или в прерывании, зависании или при завершении процесса.Here является кодом, который необходимо поместить наверху сценария.

    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

6
27.01.2020, 19:34

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

mail-after <your command>

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

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

1
27.01.2020, 19:34

Я написал 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 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, если вам нужны какие-либо улучшения.

5
27.01.2020, 19:34

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

alias shunt "(\! * | Mail -s 'Вывод: \! *' $ user)> & / dev / null & "

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

0
27.01.2020, 19:34

Suponiendo que su programa ya se está ejecutando, use bash+pgrep para verlo.

# 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;
1
27.01.2020, 19:34

Теги

Похожие вопросы