10. Выполнение команд

Zabbix использует единый функционал для внешних проверок, пользовательских параметров, элементов данных system.run, пользовательских скриптов оповещений, удалённых команд и глобальных скриптов.

Этапы выполнения

По умолчанию, все скрипты в Zabbix выполняются с имользованием оболочки sh, и оболочку по умолчанию изменить нельзя. Чтобы использовать другую оболочку, можно использовать следующий приём: создать файл скрипта и вызвать этот скрипт при выполнении команды.

Команда/скрипт выполняется одинаково как на Unix, так и на Windows платформах:

  1. Zabbix (родительский процесс) cоздаёт конвейер для связи
  2. Zabbix настраивает данный конвейер для вывода данных от создаваемого дочернего процесса
  3. Zabbix создаёт дочерний процесс (выполняет команду/скрипт)
  4. Создается новая группа процесса (в Unix) или задача (в Windows) для дочернего процесса
  5. Zabbix считывает из конвейера данные до тех пор, пока не истечёт установленное время ожидания или до момента, когда прекратится запись с другой стороны (закрыты ВСЕ обработчики/файловые дескрипторы). Обратите внимание, что дочерний процесс может создать еще некоторое количество процессов и выйти до того, как эти процессы завершатся или будет закрыт обработчик/файловый дескриптор.
  6. Если установленное время ожидания не было достигнуто, Zabbix ждёт завершения начального дочернего процесса или ждёт достижения установленного времени ожидания.
  7. Если начальный дочерний процесс завершил свою работу и время ожидания не вышло, тогда Zabbix проверяет код завершения начального дочернего процесса и сравнивает его с 0 (ненулевое значение считается ошибкой выполнения, только для пользовательских скриптов оповещений, удалённых команд и пользовательских скриптов, выполняемых на Zabbix сервере и Zabbix прокси)
  8. На этот момент подразумевается, что всё выполнено, и всё дерево процессов (т.е. группа процессов или задача) завершается.

Zabbix предполагает, что команда/скрипт завершили обработку, в тот момент, когда завершился изначальный дочерний процесс И никакие другие процессы всё ещё не держат открытым обработчик/файловый дескриптор вывода. Когда обработка завершена, ВСЕ созданные процессы завершаются.

Все двойные кавычки и обратная косая черта в команде экранируются обратной косой чертой, и вся команда заключается в двойные кавычки.

Проверка кода завершения

Код завершения проверяется на соответствие следующим условиям:

  • Только для пользовательских скриптов оповещений, удалённых команд и пользовательских скриптов, выполняемых на Zabbix сервере и Zabbix прокси.
  • Любой код завершения, отличный от 0, считается ошибкой выполнения.
  • Содержимое стандарного вывода ошибки и стандартного вывода собирается при ошибочных выполнениях и доступно в веб-интерфейсе (где отображается результат выполнения).
  • Дополнительная запись добавляется в журнал удалённых команд на Zabbix сервере, чтобы сохранить вывод выполнения скрипта, эту возможность можно включить, используя параметр агента LogRemoteCommands.

Возможные сообщения в веб-интерфейсе и записи в журналах при ошибочных командах/скриптах:

  • Содержимое стандарного вывода ошибки и стандартного вывода при ошибочных выполнениях (если имеется).
  • "Process exited with code: N." (при пустом выводе и отличном от 0 коде выхода).
  • "Process killed by signal: N." (при завершении процесса сигналом, только на Linux).
  • "Process terminated unexpectedly." (при завершениях процесса по неизвестным причинам).

Подробнее о: