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