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

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 на agent/proxy.

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

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

Смотрите также