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 на agent/proxy.
Возможные сообщения веб-интерфейса и записи журнала для неудачных команд/скриптов:
- Содержимое стандартного потока ошибок и стандартного потока вывода для неудачных выполнений (если есть).
- "Process exited with code: N." (для пустого вывода и кода выхода, не равного 0).
- "Process killed by signal: N." (если процесс завершен сигналом, только в Linux).
- "Process terminated unexpectedly." (если процесс завершен по неизвестным причинам).