Вопрос или проблема
Существует cronjob, который выполняется каждые 3 минуты следующим образом. В конце скрипта вы увидите 4 различных условия if, которые проверяют разные файлы и отправляют электронные письма в зависимости от статуса.
Предположим, что средние два блока if (success|OK) сработали и отправили письмо, также я хочу, чтобы они снова сработали в cronjob, который будет выполняться через 3 минуты, но не отправляли письмо. И отправляли письма в первом cronjob, который будет выполняться через 1 час. А затем после отправки письма они больше не будут отправляться в течение 60 минут. Таким образом, это будет цикл для каждого блока if.
Если я добавлю sleep 60m, часть после среднего блока if не будет выполняться в течение 60 минут. Тем не менее, я хочу остановить только определенный блок if, чтобы он не отправлял письма в течение 60 минут, а остальные все равно работали каждые 3 минуты.
На самом деле, если есть ситуация, когда электронное письмо отправляется один раз, я хочу, чтобы оно не отправлялось в течение следующих 60 минут и продолжало выполнение без влияния на любой другой процесс в cronjob. Тот же сценарий будет действителен и для неудачных, я просто выбрал два блока if посередине для ясности примера.
Как я могу добиться этого, используя только один cronjob?
[username@hostname ~]$ cat myJobScript.sh
...
...
...
/usr/local/bin/command -options /dir_1/dir_2/dir_3/....bin > $DIR_NAME/file1_${parameter}_${parameter}.log
/usr/local/bin/command -options /dir_1/dir_2/dir_3/....bin > $DIR_NAME/file2_${parameter}_${parameter}.log
/usr/local/bin/command -options /dir_1/dir_2/dir_3/....bin > $DIR_NAME/file3_${parameter}_${parameter}.log
/usr/local/bin/command -options /dir_1/dir_2/dir_3/....bin > $DIR_NAME/file4_${parameter}_${parameter}.log
if grep -E -w 'failure|failed|critical|warning' $DIR_NAME/file1_${parameter}_${parameter}.log >> /dev/null
then
cat $DIR_NAME/file1_${parameter}_${parameter}.log | mailx -r [email protected] -s "$parameter - что-то" [email protected]
fi
if grep -E -w 'success|OK' $DIR_NAME/file2_${parameter}_${parameter}.log >> /dev/null
then
cat $DIR_NAME/file2_${parameter}_${parameter}.log | mailx -r [email protected] -s "$parameter - что-то" [email protected]
fi
if grep -E -w 'success|OK' $DIR_NAME/file3_${parameter}_${parameter}.log >> /dev/null
then
cat $DIR_NAME/file3_${parameter}_${parameter}.log | mailx -r [email protected] -s "$parameter - что-то" [email protected]
fi
if grep -E -w 'failure|failed|critical|warning' $DIR_NAME/file4_${parameter}_${parameter}.log >> /dev/null
then
cat $DIR_NAME/file4_${parameter}_${parameter}.log | mailx -r [email protected] -s "$parameter - что-то" [email protected]
fi
Ответ или решение
Для реализации задачи, заключающейся в временной блокировке отправки определенных уведомлений электронной почтой в рамках задания Cron на RHEL 8.x или Oracle Linux 8.x, можно использовать простую, но эффективную стратегию. Давайте разберем, как это сделать, с учетом предоставленного кода.
Пошаговая инструкция по реализации временной блокировки уведомлений
1. Использование временных меток
Для контроля времени отправки уведомлений мы можем использовать временные метки, сохраняемые в файлах. Прежде чем отправить уведомление, скрипт проверит, прошло ли 60 минут с момента последней отправки.
2. Пример реализации
Давайте модифицируем ваш скрипт myJobScript.sh
, добавив логику для временной блокировки отправки уведомлений. Я воспользуюсь файлами, которые будут хранить время последней отправки уведомления для каждого блока if
.
#!/bin/bash
# Определение переменных
DIR_NAME="/path/to/dir"
parameter="example_param"
# Команды для выполнения
/usr/local/bin/command -options /dir_1/dir_2/dir_3/....bin > $DIR_NAME/file1_${parameter}.log
/usr/local/bin/command -options /dir_1/dir_2/dir_3/....bin > $DIR_NAME/file2_${parameter}.log
/usr/local/bin/command -options /dir_1/dir_2/dir_3/....bin > $DIR_NAME/file3_${parameter}.log
/usr/local/bin/command -options /dir_1/dir_2/dir_3/....bin > $DIR_NAME/file4_${parameter}.log
# Функция для проверки и отправки уведомлений
send_mail_if_needed() {
local log_file=$1
local email=$2
local subject="$3"
local last_send_file="$DIR_NAME/${4}_last_send.txt"
# Получаем текущее время
current_time=$(date +%s)
# Читаем время последней отправки
if [ -f "$last_send_file" ]; then
last_send_time=$(cat "$last_send_file")
else
last_send_time=0
fi
# Проверяем, прошло ли 60 минут с момента последней отправки
if (( (current_time - last_send_time) >= 3600 )); then
if grep -E -w 'success|OK' "$log_file" &> /dev/null; then
cat "$log_file" | mailx -r [email protected] -s "$subject" [email protected]
echo "$current_time" > "$last_send_file" # обновление времени последней отправки
fi
fi
}
# Обработка различных логов
if grep -E -w 'failure|failed|critical|warning' "$DIR_NAME/file1_${parameter}.log" &> /dev/null; then
send_mail_if_needed "$DIR_NAME/file1_${parameter}.log" "[email protected]" "$parameter - проблема" "file1"
fi
if grep -E -w 'success|OK' "$DIR_NAME/file2_${parameter}.log" &> /dev/null; then
send_mail_if_needed "$DIR_NAME/file2_${parameter}.log" "[email protected]" "$parameter - успех" "file2"
fi
if grep -E -w 'success|OK' "$DIR_NAME/file3_${parameter}.log" &> /dev/null; then
send_mail_if_needed "$DIR_NAME/file3_${parameter}.log" "[email protected]" "$parameter - успех" "file3"
fi
if grep -E -w 'failure|failed|critical|warning' "$DIR_NAME/file4_${parameter}.log" &> /dev/null; then
send_mail_if_needed "$DIR_NAME/file4_${parameter}.log" "[email protected]" "$parameter - проблема" "file4"
fi
Объяснение решения
-
Запись временных меток: В каждом случае, когда отправляется письмо, текущее время записывается в отдельный файл. Он называется
file1_last_send.txt
,file2_last_send.txt
и так далее. -
Проверка времени: Перед отправкой письма скрипт проверяет, прошло ли 3600 секунд (60 минут) с момента последней отправки.
-
Гибкость: Каждая часть скрипта может работать независимо, гарантируя, что отправка уведомлений для одного блока не повлияет на остальные.
Заключение
Данное решение позволяет вам сохранять контроль над отправкой уведомлений в Cron, не нарушая основного функционала скрипта. Это создаст более надежный и управляемый процесс мониторинга, поддерживая структуру и читабельность вашего кода.