скрипт уведомляет узел о сбое

#linux #bash #shell

#linux #bash #оболочка

Вопрос:

У меня есть скрипт, который отправляет электронное письмо, когда один из моих узлов DRBD не работает, этот скрипт запускается каждые 4 млн, проблема в том, что когда один из узлов выходит из строя (не работает), скрипт продолжает отправлять электронные письма каждые 4 млн, как я могу заставить скрипт отправлять только один раз в день или каждые 24 часа ?.

Я публикую текущий скрипт.

 #!/bin/sh
NOTIFY_EMAIL="ray@superdomain.com"
SENDMAIL="/opt/zimbra/common/sbin/sendmail"
SUBJECT="Nodo Cluster DRBD Down"
status=$(egrep "(Connected)" /proc/drbd |wc -l)

if [ ! $status -eq 1 ] ; then
  echo -e "Subject: $SUBJECTnFrom: ROBOT@$HOSTNAMEn$HOSTNAME DRBD AlertnDate:`date`nn `/usr/sbin/pcs status` "| $SENDMAIL $NOTIFY_EMAIL
fi
  

Комментарии:

1. Пожалуйста, вставьте фактический код.

2. Значит, с вашим кодом нет реальной проблемы? Вам просто нужно мнение, когда его запускать??

3. Извините, если я не понял, этот скрипт работает, если один из моих узлов выходит из строя, он отправляет уведомление, проблема в том, что этот скрипт находится в задаче crontab и запускается каждые 4 минуты, я получаю уведомление каждые 4 минуты, я просто хочу, чтобы уведомление было отправленоодин раз в день.

4. Просто запишите время последнего уведомления в файл. Затем либо отправляйте только в том случае, если время прошло более одного дня назад, либо даже оптимизируйте дальше, изменив время следующего расписания crontab.

5. Вопрос был закрыт во время написания ответа. Краткая версия: используйте подходящий файл для хранения временной метки TIMESTAMPFILE="/var/tmp/myscript.mail.sent" . Завершите отправку почты дополнительной проверкой if [ -z $(find "$TIMESTAMPFILE" -mtime 0 2>/dev/null) ] ; then touch "$TIMESTAMPFILE"; echo ...|sendmail ... ; fi . Объяснение: find "$TIMESTAMPFILE" -mtime 0 выводит имя файла, если время изменения меньше 24 часов назад. Если файл не существует или он старше, вывод будет пустым. Проверено с if [ -z $(...) ] помощью . touch ... создает файл или обновляет время изменения при отправке почты.)

Ответ №1:

Предполагая, что вы хотите продолжать выполнять проверку каждые 4 минуты, но подавлять повторные сообщения в тот же день или в течение 24 часов, вам нужно сохранить время отправки почты.

Для этой цели можно использовать время изменения файла.

 #!/bin/sh
NOTIFY_EMAIL="ray@superdomain.com"
SENDMAIL="/opt/zimbra/common/sbin/sendmail"
SUBJECT="Nodo Cluster DRBD Down"

TIMESTAMPFILE="/var/tmp/myscript.mail.sent"

status=$(egrep "(Connected)" /proc/drbd |wc -l)

if [ ! $status -eq 1 ] ; then
  if [ -z $(find "$TIMESTAMPFILE" -mtime 0 2>/dev/null) ] ; then
    touch "$TIMESTAMPFILE"
    echo -e "Subject: $SUBJECTnFrom: ROBOT@$HOSTNAMEn$HOSTNAME DRBD AlertnDate:`date`nn `/usr/sbin/pcs status` "| $SENDMAIL $NOTIFY_EMAIL
  fi
fi
  

Эта версия будет подавлять почту в течение 24 часов.

Объяснение:

find "$TIMESTAMPFILE" -mtime 0 выводит имя файла, если файл существует, и отметка времени его изменения менее 24 часов назад. Если файл не существует или он старше, вывод будет пустым.

Проверка на пустой вывод if [ -z $(find ...) ] означает, что в последнее время почта не отправлялась или состояние неизвестно (нет файла).

touch "$TIMESTAMPFILE" создает файл или обновляет время модификации, чтобы сохранить время отправки почты.

Если вы хотите отключить почту за текущий календарный день вместо 24 часов, вы можете добавить опцию -daystart в find команду.

   if [ -z $(find "$TIMESTAMPFILE" -daystart -mtime 0 2>/dev/null) ] ; then