10 Выполнение команд
Zabbix использует единый функционал для внешних проверок, пользовательских параметров, элементов данных system.run, пользовательских скриптов оповещений, удаленных команд и глобальных скриптов.
Шаги выполнения
По умолчанию все скрипты в Zabbix выполняются с использованием оболочки sh, и изменить оболочку по умолчанию невозможно. Чтобы использовать другую оболочку, можно воспользоваться обходным путем: создать файл скрипта и вызывать этот скрипт при выполнении команды.
Команда/скрипт выполняется аналогично как на платформах Unix, так и на Windows:
- Zabbix (родительский процесс) создает канал для связи.
- Zabbix устанавливает канал как выходной поток для создаваемого дочернего процесса.
- Zabbix создает дочерний процесс (запускает команду/скрипт).
- Для дочернего процесса создается новая группа процессов (в Unix) или задача (в Windows).
- Zabbix читает данные из канала до тех пор, пока не истечет время ожидания или пока никто не будет записывать в другой конец (все дескрипторы файлов были закрыты). Обратите внимание, что дочерний процесс может создать другие процессы и завершиться до их завершения или закрытия дескриптора файла.
- Если время ожидания не истекло, Zabbix ждет завершения начального дочернего процесса или наступления таймаута.
- Если начальный дочерний процесс завершился и время ожидания не истекло, Zabbix проверяет код завершения начального дочернего процесса и сравнивает его с 0 (ненулевое значение рассматривается как ошибка выполнения, только для пользовательских скриптов оповещения, удалённых команд и пользовательских скриптов, выполняемых на сервере Zabbix и прокси Zabbix).
- На этом этапе предполагается, что все выполнено, и вся древовидная структура процессов (т.е. группа процессов или задача) завершена.
Zabbix предполагает, что команда/скрипт завершил обработку, когда начальный дочерний процесс завершился И ни один другой процесс больше не удерживает открытым дескриптор вывода. Когда обработка завершена, все созданные процессы завершаются.
Все двойные кавычки и обратные слеши в команде экранируются обратными слешами, и команда заключается в двойные кавычки.
Проверка кода завершения
Код завершения проверяется при выполнении следующих условий:
- Только для пользовательских скриптов оповещения, удалённых команд и пользовательских скриптов, выполняемых на сервере Zabbix и прокси Zabbix.
- Любой код завершения, отличный от 0, считается ошибкой выполнения.
- Содержимое стандартного потока ошибок и стандартного вывода для неудачных выполнений собирается и доступно на веб-интерфейсе (где отображается результат выполнения).
- Дополнительная запись в журнале создается для удалённых команд на сервере Zabbix, чтобы сохранить вывод выполнения скрипта. Она может быть включена с помощью параметра агента LogRemoteCommands.
Возможные сообщения на фронтенде и записи в журнале для неудачных команд/скриптов:
- Содержимое стандартного потока ошибок и стандартного вывода для неудачных выполнений (если есть).
- "Процесс завершился с кодом: N." (для пустого вывода и кода завершения, не равного 0).
- "Процесс был завершен сигналом: N." (для процессов, завершенных сигналом, только на Linux).
- "Процесс завершился неожиданно." (для процессов, завершенных по неизвестным причинам).