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

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

Все команды и скрипты выполняются с правами пользователя ОС, от имени которого запущен агент Zabbix. Пользователь должен иметь достаточные права для выполнения команды или скрипта.

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

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

Команда или скрипт выполняется аналогичным образом на платформах Unix и Windows:

  1. Zabbix (родительский процесс) создает канал для обмена данными.
  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. (для процесса, завершённого по неизвестным причинам).

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