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