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