9. Выполнение команд
Zabbix использует единый функционал для внешних проверок, пользовательских параметров, элементов данных system.run, пользовательских скриптов оповещений, удалённых команд и глобальных скриптов.
Этапы выполнения
По умолчанию, все скрипты в Zabbix выполняются с имользованием оболочки sh, и оболочку по умолчанию изменить нельзя. Чтобы использовать другую оболочку, можно использовать следующий приём: создать файл скрипта и вызвать этот скрипт при выполнении команды.
Команда/скрипт выполняется одинаково как на Unix, так и на Windows платформах:
- Zabbix (родительский процесс) cоздаёт конвейер для связи
- Zabbix настраивает данный конвейер для вывода данных от создаваемого дочернего процесса
- Zabbix создаёт дочерний процесс (выполняет команду/скрипт)
- Создается новая группа процесса (в Unix) или задача (в Windows) для дочернего процесса
- Zabbix считывает из конвейера данные до тех пор, пока не истечёт установленное время ожидания или до момента, когда прекратится запись с другой стороны (закрыты ВСЕ обработчики/файловые дескрипторы). Обратите внимание, что дочерний процесс может создать еще некоторое количество процессов и выйти до того, как эти процессы завершатся или будет закрыт обработчик/файловый дескриптор.
- Если установленное время ожидания не было достигнуто, Zabbix ждёт завершения начального дочернего процесса или ждёт достижения установленного времени ожидания.
- Если начальный дочерний процесс завершил свою работу и время ожидания не вышло, тогда Zabbix проверяет код завершения начального дочернего процесса и сравнивает его с 0 (ненулевое значение считается ошибкой выполнения, только для пользовательских скриптов оповещений, удалённых команд и пользовательских скриптов, выполняемых на Zabbix сервере и Zabbix прокси)
- На этот момент подразумевается, что всё выполнено, и всё дерево процессов (т.е. группа процессов или задача) завершается.
Zabbix предполагает, что команда/скрипт завершили обработку, в тот момент, когда завершился изначальный дочерний процесс И никакие другие процессы всё ещё не держат открытым обработчик/файловый дескриптор вывода. Когда обработка завершена, ВСЕ созданные процессы завершаются.
Все двойные кавычки и обратная косая черта в команде экранируются обратной косой чертой, и вся команда заключается в двойные кавычки.
Проверка кода завершения
Код завершения проверяется на соответствие следующим условиям:
- Только для пользовательских скриптов оповещений, удалённых команд и пользовательских скриптов, выполняемых на Zabbix сервере и Zabbix прокси.
- Любой код завершения, отличный от 0, считается ошибкой выполнения.
- Содержимое стандарного вывода ошибки и стандартного вывода собирается при ошибочных выполнениях и доступно в веб-интерфейсе (где отображается результат выполнения).
- Для удалённых команд, выполняемых на Zabbix агенте/прокси, дополнительная запись в журнале может создаваться, используя параметр LogRemoteCommands на агенте/прокси.
Возможные сообщения в веб-интерфейсе и записи в журналах при ошибочных командах/скриптах:
- Содержимое стандарного вывода ошибки и стандартного вывода при ошибочных выполнениях (если имеется).
- «Process exited with code: N». (при пустом выводе и отличном от 0 коде завершения).
- «Process killed by signal: N». (при завершении процесса сигналом, только на Linux).
- «Process terminated unexpectedly». (при завершении процесса по неизвестным причинам).