Процессы операционной системы
При обсуждении выполнения каких-либо программ под управлением операционной системы используется термин процесс. Процессом будем называть отражение исполняемого файла на ресурсы компьютера: занятая оперативная память, загруженный в память исполняемый код и т. д. «1С:Исполнитель» позволяет работать с процессами операционной системы, но не с любым процессом, а только с теми, которые запущены из текущего сценария. Другими словами, вы не можете подключиться к процессу уже запущенного приложения. В то же время, если вы сами запускаете какое-либо приложение, то процесс данного приложения будет вам доступен и вы сможете с ним взаимодействовать.
Для работы с процессами операционной системы предназначен тип ПроцессОс
. Важно понимать, что экземпляр типа ПроцессОс
не является интерпретатором команд операционной системы.
Работа с процессом состоит из нескольких шагов, описанных ниже.
Создание нового процесса
Экземпляр ПроцессОс
создается с помощью конструктора. Если приложение, с которым будет связан процесс, должно получить на вход какие-то параметры, эти параметры необходимо указать именно при создании экземпляра ПроцессОс
. Создание процесса не означает, что приложение будет запущено. Также имеется возможность указать, что стандартные потоки вывода и ошибок можно объединить.
Запуск созданного процесса
Для запуска процесса предназначен метод Запустить()
. Запускаемый процесс наследует переменные окружения родительского процесса. При запуске можно указать текущий каталог для запускаемого процесса с помощью параметра Каталог.
Работа с процессом
«1С:Исполнитель» предоставляет следующие возможности по работе с процессом:
-
Живой()
Выполняет проверку, что с экземпляром
ПроцессОс
еще ассоциирован какой-то процесс операционной системы -
Остановить()
Останавливает процесс
-
ПолучитьPid()
Получает идентификатор процесса в терминах используемой операционной системы
советРеальный идентификатор процесса будет получен только в том случае, если «1С:Исполнитель» работает с использованием Java версии 9 и выше.
-
ОжидатьЗавершения()
Ожидает завершения работы процесса
-
ПолучитьПотокВвода()
Получает стандартный ввод запущенного приложения. Он возвращает экземпляр типа
ПотокЗаписи
. В него вы можете записывать текст, который будет передан экземпляру типаПроцессОС
.пер ВходныеДанные = Процесс.ПолучитьПотокВвода()
ВходныеДанные.Записать("Текст как входные данные Процесса")ПолучитьПотокВвода()
можно вызвать только после запускаПроцессОС
. П ока вы не закроете полученный таким образомПотокЗаписи
,ПроцессОС
будет ожидать входные данные. Ниже приведен пример передачи строки поиска командному интерпретатору cmd.метод Grep(Вход: Строка, Фильтр: Строка): Строка
// Аналог grep в Windows. Требует входных данных
пер Процесс = новый ПроцессОс(cmd.exe", ["/c", "findstr %Фильтр"])
// Указать входные данные можно только после старта процесса
Процесс.Запустить()
область
исп Поток = Процесс.ПолучитьПотокВвода()
Поток.Записать(Вход)
; // Даем понять, что входных данных процесс может больше не ожидать
возврат Процесс.ПолучитьПотокВывода().ПрочитатьКакСтроку()
; -
ПолучитьПотокВывода()
Получает стандартный вывод запущенного приложения. Необходимо получить экземпляр типа
ПотокЧтения
(ПроцессОС.ПолучитьПотокВывода()
) и затем читать изПотокЧтения
информацию, которая туда помещается процессом (ПотокЧтения.ПрочитатьКакСтроку()
). С помощью этого метода можно реализовать сценарий, который будет анализировать вывод другого приложения и использовать полученные данные для принятия решений в режиме реального времени.советЕсли настроен вывод в консоль, то при чтении из нее вы можете столкнуться с неправильной кодировкой символов кириллицы. В этом случае передавайте нужную кодировку параметром в метод
ПрочитатьКакСтроку()
. -
ПолучитьПотокОшибок()
Получить стандартный поток ошибок запущенного приложения.
-
ПотокиОшибокИВыводаСоединены
Если экземпляр типа
ПроцессОс
получен вами извне (вы не создавали его в своем коде), это свойство позволяет узнать, в какой поток направляются ошибки:Истина
— ошибки направляются в стандартный поток вывода;Ложь
— ошибки направляются в стандартный поток ошибок.
примечаниеУправлять направлением ошибок вы можете в конструкторе
ПроцессОс
с помощью параметра СоединитьПотокиОшибокИВывода. Как правило, потоки соединены, и ошибки направляются в стандартный поток вывода.
Чтение потока вывода частями
Методы ПроцессОС.ПолучитьПотокВывода()
и ПроцессОС.ПолучитьПотокОшибок()
позволяют читать данные выходного потока частями, как показано в примере ниже:
метод ВыполнитьКомандуИВывестиВКонсоль(ИмяКоманды: Строка,
Параметры: ЧитаемыйМассив<Объект>)
пер Процесс = новый ПроцессОс(ИмяКоманды, Параметры, Ложь)
Процесс.Запустить()
исп РезультатВыполненияСкрипта = Процесс.ПолучитьПотокВывода()
пока не Процесс.ОжидатьЗавершения(60с)
знч ТекстРезультата = РезультатВыполненияСкрипта.ПрочитатьКакСтроку()
если не ТекстРезультата.Пусто()
Консоль.Записать(ТекстРезультата)
;
;
знч ТекстРезультата = РезультатВыполненияСкрипта.ПрочитатьКакСтроку()
если не ТекстРезультата.Пусто()
Консоль.Записать(ТекстРезультата)
;
;
Для получения данных всего потока необходимо дождаться завершения процесса с помощью метода ПроцессОС.ОжидатьЗавершения()
. Поток вывода будет закрыт автоматически при выходе экземпляра ПроцессОс
из области видимости.
Организовать конвейер процессов (pipe)
Конвейер (pipe) — это способ межпроцессного взаимодействия, при котором выходной поток одного процесса является входным потоком для другого. Вы можете создавать конвейеры с помощью метода ПроцессОС.ПередатьВыводВ()
. Он добавляет новый процесс в конвейер на основе команды и аргументов. К процессу в конвейере применяются те же настройки, что и к исходному ПроцессОс
. Метод возвращает текущий экземпляр ПроцессОс
, в котором выходной поток соответствует выходному потоку нового процесса.
Для корректной работы метода необходимо, чтобы экземпляр работал в окружении Java 9+.
Ниже приведен пример просмотра папки и поиска подстроки в Windows:
метод ПросмотретьПапкуИНайтиПодстроку(ПапкаДляПросмотра: Строка, Фильтр: Строка): Строка
// Аналог ls в Windows
пер Процесс = новый ПроцессОс("cmd.exe", ["/c", "dir " + ПапкаДляПросмотра])
// Передадим вывод аналогу grep в Windows
Процесс.ПередатьВыводВ("cmd.exe", ["/c", "findstr " + Фильтр])
// Запустим конвейер
Процесс.Запустить()
возврат Процесс.ПолучитьПотокВывода().ПрочитатьКакСтроку()
;
Обработка завершения работы процесса
Чтобы обработать завершение работы процесса, можно проанализировать код возврата приложения, полученный с помощью метода ПолучитьКодВозврата()
:
метод РаботаСПроцессом(): Строка
// Создадим процесс и разделим потоки ошибок и вывода
пер Процесс = новый ПроцессОс("cmd.exe", ["/c", "dir c:\\windows /N /4"], СоединитьПотокиОшибокИВывода = Ложь)
Процесс.Запустить()
// Код 0 считается нормальным завершением процесса
если Процесс.ПолучитьКодВозврата() == 0
возврат Процесс.ПолучитьПотокВывода().ПрочитатьКакСтроку()
иначе
возврат Процесс.ПолучитьПотокОшибок().ПрочитатьКакСтроку()
;
;