RHEL 8.x / Oracle Linux 8.x – Как временно приостановить только определённую часть задания в crontab?

Вопрос или проблема

Существует 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

Объяснение решения

  1. Запись временных меток: В каждом случае, когда отправляется письмо, текущее время записывается в отдельный файл. Он называется file1_last_send.txt, file2_last_send.txt и так далее.

  2. Проверка времени: Перед отправкой письма скрипт проверяет, прошло ли 3600 секунд (60 минут) с момента последней отправки.

  3. Гибкость: Каждая часть скрипта может работать независимо, гарантируя, что отправка уведомлений для одного блока не повлияет на остальные.

Заключение

Данное решение позволяет вам сохранять контроль над отправкой уведомлений в Cron, не нарушая основного функционала скрипта. Это создаст более надежный и управляемый процесс мониторинга, поддерживая структуру и читабельность вашего кода.

Оцените материал
Добавить комментарий

Капча загружается...