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

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

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

Команда/скрипт выполняется одинаково как на UNIX, так и на Windows-платформах:

  1. Подсистема (родительский процесс) создает конвейер для связи;
  2. Подсистема настраивает данный конвейер для вывода данных от создаваемого дочернего процесса;
  3. Подсистема создает дочерний процесс (выполняет команду/скрипт);
  4. создается новая группа процесса (в UNIX) или задача (в Windows) для дочернего процесса;
  5. Подсистема считывает из конвейера данные до тех пор, пока не истечет установленное время ожидания или до момента, когда прекратится запись с другой стороны (закрыты все обработчики/файловые дескрипторы). Следует обратить внимание, что дочерний процесс может создать еще некоторое количество процессов и выйти до того, как эти процессы завершатся или будет закрыт обработчик/файловый дескриптор;
  6. если установленное время ожидания не было достигнуто, Подсистема ждет завершения начального дочернего процесса или ждет достижения установленного времени ожидания;
  7. если начальный дочерний процесс завершил свою работу и время ожидания не окончилось, то Подсистема проверяет код завершения начального дочернего процесса и сравнивает его с 0 (ненулевое значение считается ошибкой выполнения только для пользовательских скриптов оповещений, удаленных команд и пользовательских скриптов, выполняемых на Сервере и Прокси);
  8. на этот момент подразумевается, что все выполнено, и все дерево процессов (т.е. группа процессов или задача) завершается.

Подсистема определяет, что команда/скрипт завершили обработку в тот момент, когда завершился изначальный дочерний процесс, и никакие другие процессы не держат открытым обработчик/файловый дескриптор вывода. Когда обработка завершена, все созданные процессы завершаются.

Все двойные кавычки и обратная косая черта в команде экранируются обратной косой чертой, и вся команда заключается в двойные кавычки.

Код завершения проверяется на соответствие следующим условиям:

  • только для пользовательских скриптов оповещений, удаленных команд и пользовательских скриптов, выполняемых на Сервере и Прокси;
  • любой код завершения, отличный от 0, считается ошибкой выполнения;
  • содержимое стандартного вывода ошибки и стандартного вывода собирается при ошибочных выполнениях и доступно в веб-интерфейсе (где отображается результат выполнения);
  • дополнительная запись добавляется в журнал удаленных команд на Сервере, чтобы сохранить вывод выполнения скрипта; эту возможность можно включить, используя параметр Агента LogRemoteCommands.

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

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