Bash — Как я могу отправить уведомление один раз, если служба не запущена?

#linux #bash #shell

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

Вопрос:

Я запускаю следующий скрипт, чтобы проверить, запущены ли мои службы docker. Если служба не запущена, скрипт отправил сообщение в мое приложение rocketchat через webhook следующим образом:

 #!/bin/sh
# Shell script to monitor docker services every minute
# -------------------------------------------------------------------------------------------

# set webhook url
RocketURL=https://example.com/webhook;
# get all containers 
Containers=$(docker ps -a | awk '{if(NR>1) print $NF}')

for i in $Containers
do
  isServiceRunning=$(docker inspect --format="{{.State.Running}}" $i)
  if [ $isServiceRunning = false ]; then
    /home/user/scripts/sendMessage.sh -b "The Docker Service: $i is not running. Please fix it" -u $RocketURL
  fi
done
  

Это работает, но если служба docker не запущена, я снова получаю сообщение каждую минуту, потому что скрипт запускается каждую минуту через cronjob. Итак, как я могу предотвратить это? Я хочу получить только одно сообщение, когда служба не запущена. Как я могу это сделать?

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

1. Вы можете, например, создать файл при отправке сообщения и отправить сообщение только тогда, когда файл не существует. Удалите файл, если служба запущена.

2. @choroba спасибо, не могли бы вы привести мне небольшой пример? может быть, в качестве ответа, чтобы я мог следовать?

3. Решения для мониторинга, такие как Nagios, управляют подобными ситуациями.

Ответ №1:

Создайте файл при отправке сообщения и отправляйте сообщение только тогда, когда файл не существует. Удалите файл, если служба запущена.

 for container in $Containers ; do
    processed=/tmp/noturn."$container"
    isServiceRunning=$(docker inspect --format="{{.State.Running}}" "$container")
    if [ "$isServiceRunning" = false ] ; then
        if [ ! -e "$processed" ] ; then
            /home/user/scripts/sendMessage.sh -b "The Docker Service: $i is not running. Please fix it" -u "$RocketURL"
        fi
        touch "$processed"
    else
        rm -f "$processed"
    fi
done