Go to content Go to menu Go to search

Настраиваем мониторинг выполнения Windows Scheduled Tasks при помощи Zabbix

Постановка задачи

На win-сервере возникла проблема – иногда (очень редко) служба Task Scheduler переставала работать. Причину установить не удалось. Симптомы – запущенные задачи завершались успешно, но служба не видела завершения и показывала, что задача запущена. При этом сама служба шедулера не могла остановить задачу, поскольку процесса задачи по факту уже не существовало. Проблема лечилась перезапуском службы Task Scheduler.

Решение

Для отслеживания ситуации на сервер был установлен zabbix-agent В zabbix-клиенте настраиваем внешний скрипт, который проверяет поле “Last Run Time” для задачи, которая должна запускаться каждые 15 минут (задача отрабатывает за несколько секунд). В том случае, если задача поле “Last Run Time” показывает значение старше чем 30 минут (т.е. задача не запускалась за последние 15 минут), читаем, что есть проблема, описанная выше.

Для выяснения состояния поля “Last Run Time” используем команду schtasks /QUERY /FO CSV /V данная команда выводит в формате CSV полный список задач из планировщика со всеми полями.

Для того, что бы распарсить CSV будем использовать UnixUtils (которые предварительно нужно поставить). А именно будем использовать sh, sed и awk.

Реализация

Создаем скрипт для Zabbix-agent: C:/Zabbix/tasks-check.sh.

Скрипт принимает в качестве аргументов <имя задачи> и <максимальное время с прошлого запуска в минутах> Скрипт запускает schtasks, при помощи sed вытаскивает значения часа и минуты последнего запуска, после чего вычисляет некое абсолютное значение в минутах по формуле: "час запуска" * 60 + "минута последнего запуска" Далее полученное абсолютное значение сравнивается с аналогичным абсолютным значением, вычисленным на основании текущего времени. Если разница между значениями больше чем допустимое значение, то на выходе скрипта показываем 1.

Внимание! Данный скрипт предназначен для парсинга англоязычной версии windows! в англоязычной версии команда schtasks выдает время в 12-ти часовом формате, по этому пришлось кроме часов и минут вытаскивать еще значение AM/PM и в awk добавлять дополнительные правила вычисления. Для русской версии нужно скрипт немного исправить (упростить awk и убрать парттерн ([AP]M) в sed)

PATTERN=$1 # имя задачи
MAX_RUNNING_TIME=$2 # максимальное время после прошлого запуска в минутах

LAST_RUNNING_TIME=`schtasks /QUERY /FO CSV /V | sed -n  "/^\".*\",\"$PATTERN\",\".*\",\".*\",\".*\",\"\([0-9][0-9]*\):\([0-9][0-9]*\):[0-9][0-9]* \([AP]M\), .*\",\".*\",\".*\",\".*\",\".*\",\".*\",\".*\",\".*\",\".*\",\".*\",\".*\",\".*\",\".*\",\".*\",\".*\",\".*\",\".*\",\".*\",\".*\",\".*\",\".*\",\".*\",\".*\"/s//\1 \2 \3/p" \ 
| gawk '{ if ($3 == "PM" && $1 < 12) {$1=$1+12}; if ($3 == "AM" && $1 == 12) {$1=0}; running_time=($1*60)+$2; print running_time}'`

NOW_TIME=$((`udate +%H`*60+`udate +%M`))
FACT_RUNNING_TIME=$(($NOW_TIME-$LAST_RUNNING_TIME))

if [ $FACT_RUNNING_TIME -ge $MAX_RUNNING_TIME ]; then
#echo "$FACT_RUNNING_TIME ge $MAX_RUNNING_TIME"
echo 1
else
#echo "$FACT_RUNNING_TIME lt $MAX_RUNNING_TIME"
echo 0
fi

В C:/Zabix/zabbix_agentd.conf указываем пользовательский параметр:

UserParameter=tasks[*],sh C:/zabbix/tasks-check.sh "$1" "$2"

после этого рестартовать сервис zabbix.

На стороне zabbix-сервера:

1). Создаем группу элементов данных Tasks

2). Создаем элемент данных:

Тип: Zabbix Agent
Ключ: tasks[“REIL Check Hourly Status”,30]

увеличить

3). Создаем триггер:

{OLD-MLS1-PMSERVER:tasks["REIL Check Hourly Status",30].last(0)}=1

увеличить

Готово!


при публикации материалов с данного сайта обратная ссылка на сайт обязательна.
valynkin.ru © no rights reserved