#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