#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