У меня есть важное приложение, которое запускает systemd как служба.
Он настроен на перезапуск при возникновении сбоя.
Как отправить электронное письмо, если приложение перезапустится?
Сначала вам нужны два файла: исполняемый файл для отправки почты и .service для запуска исполняемого файла. В этом примере исполняемый файл - это просто сценарий оболочки, использующий sendmail
:
/usr/local/bin/systemd-email:
#!/bin/bash
/usr/bin/sendmail -t <<ERRMAIL
To: $1
From: systemd <root@$HOSTNAME>
Subject: $2
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset=UTF-8
$(systemctl status --full "$2")
ERRMAIL
Какой бы исполняемый файл вы ни использовали, он, вероятно, должен принимать по крайней мере два аргумента, как этот сценарий оболочки: адрес для отправки и файл модуля, для которого нужно получить статус. В .service
мы создаем передадим эти аргументы:
/etc/systemd/system/status-email-user@.service:
[Unit]
Description=status email for %i to user
[Service]
Type=oneshot
ExecStart=/usr/local/bin/systemd-email address %i
User=nobody
Group=systemd-journal
куда пользователь отправляется ли пользователю электронное письмо и адрес адрес электронной почты этого пользователя. Хотя получатель жестко запрограммирован, файл модуля для отчета передается как параметр экземпляра, поэтому эта одна служба может отправлять электронную почту для многих других модулей. На этом этапе вы можете начать status-email-user@dbus.service
чтобы убедиться, что вы можете получать электронные письма.
Затем просто отредактируйте службу, для которой вы хотите получать электронные письма, и добавьте OnFailure=status-email-user@%n.service
к [Unit]
раздел. %n
передает имя объекта в шаблон.
Источник: archlinux wiki: системные таймеры MAILTO
Решение, предложенное @gf_, хорошо сработало в нашей ситуации с запуском clickhouse на CentOS7. Clickhouse дает нам несколько регулярных сбоев, поэтому нам нужно было перезапустить его автоматически и получать уведомление о перезапуске. Хотя добавление второй службы в systemd кажется немного неуклюжим, это необходимо из-за конструкции systemd.
При этом это решение в сочетании с автоматическим перезапуском перестало работать для нас, когда мы развернулись на CentOS8. Это связано с тем, что systemd v239, поставляемый в C8, внес изменения в OnFailure=
семантика в сочетании с нестандартной конфигурацией Restart=
(Restart=on-failure
в нашем случае). Новый OnFailure=
поведение запускает однократную службу только в случае полного сбоя перезапуска, а не только после сбоя. Это новое поведение с радостью перезапустит службу, но мы не получим электронное письмо как OnFailure=
больше не вызывается.
Обратите внимание на наше основное ожидание: мы хотели, чтобы systemd перезапустил процесс и отправил уведомление по электронной почте. После обновления v239 наше предыдущее решение, указанное gf_, больше не работает. К счастью, мы смогли заставить это работать.
Наше решение - использовать ExecStopPost
для вызова сценария уведомления по электронной почте. Это работает нормально, но теперь возникла новая проблема: уведомление по электронной почте было отправлено, когда служба clickhouse запускалась нормально, например, при запуске сервера. Хотя это не проблема, в идеале мы хотели получать уведомления по электронной почте. только о сбоях. Мы смогли добиться этого, добавив следующий код в сценарий электронной почты:
# Don't do anything if the service intentionally stopped successfully.
if [ $SERVICE_RESULT == "success" ]; then
exit
fi
... $SERVICE_RESULT
переменная среды, предоставляемая systemd целевому процессу ExecStopPost
. Проверяя наличие success
В результате мы предполагаем, что этот вызов произошел при нормальном запуске или завершении работы, и ничего не делаем. На любое другое значение, например signal
, сценарий продолжит отправку электронного письма. Возможные значения этой переменной указаны в документация.
Спасибо gf_ за первоначальное решение. Я надеюсь, что люди сочтут мое обновление полезным для CentOS8. Еще несколько ссылок, которые мне помогли:
Вы можете попробовать использовать параметр службы systemd ExecStartPost.
Описание доступно здесь:
https://www.freedesktop.org/software/systemd/man/systemd.service.html
В файле определения службы может быть больше объявлений этой опции. Он запускается один за другим.
У вас также будет несколько примеров в вашей системе.
Вы можете создать сценарий оболочки для проверки статуса службы и отправки электронной почты во время загрузки сервера. Эта ссылка может вам помочь
https://askubuntu.com/questions/814/how-to-run-scripts-on-start-up