- Linux pipes tips & tricks
- Pipe — что это?
- Логика
- Простой дебаг
- Исходный код, уровень 1, shell
- Исходный код, уровень 2, ядро
- Tips & trics
- Организация взаимодействия процессов через pipe и FIFO в UNIX
- Понятие о pipe. Системный вызов pipe()
- Прогон программы для pipe в одном процессе
- Организация связи через pipe между процессом-родителем и процессом-потомком. Наследование файловых дескрипторов при вызовах fork() и exec()
- Прогон программы для организации однонаправленной связи между родственными процессами через pipe
- Модуль child_process¶
- Создание асинхронного процесса¶
- Нерест .bat а также .cmd файлы в Windows¶
- child_process.exec(command[, options][, callback]) ¶
- child_process.execFile(file[, args][, options][, callback]) ¶
- child_process.fork(modulePath[, args][, options]) ¶
- child_process.spawn(command[, args][, options]) ¶
- options.detached ¶
- options.stdio ¶
- Создание синхронного процесса¶
- child_process.execFileSync(file[, args][, options]) ¶
- child_process.execSync(command[, options]) ¶
- child_process.spawnSync(command[, args][, options]) ¶
- Класс: ChildProcess ¶
- Событие: ‘close’ ¶
- Событие: ‘disconnect’ ¶
- Событие: ‘error’ ¶
- Событие: ‘exit’ ¶
- Событие: ‘message’ ¶
- Событие: ‘spawn’ ¶
- subprocess.channel ¶
- subprocess.channel.ref() ¶
- subprocess.channel.unref() ¶
- subprocess.connected ¶
- subprocess.disconnect() ¶
- subprocess.exitCode ¶
- subprocess.kill([signal]) ¶
- subprocess.killed ¶
- subprocess.pid ¶
- subprocess.ref() ¶
- subprocess.send(message[, sendHandle[, options]][, callback]) ¶
- Пример: отправка серверного объекта¶
- Пример: отправка объекта сокета¶
- subprocess.signalCode ¶
- subprocess.spawnargs ¶
- subprocess.spawnfile ¶
- subprocess.stderr ¶
- subprocess.stdin ¶
- subprocess.stdio ¶
- subprocess.stdout ¶
- subprocess.unref() ¶
- maxBuffer и Юникод¶
- Требования к оболочке¶
- Оболочка Windows по умолчанию¶
- Расширенная сериализация¶
Linux pipes tips & tricks
Pipe — что это?
Pipe (конвеер) – это однонаправленный канал межпроцессного взаимодействия. Термин был придуман Дугласом Макилроем для командной оболочки Unix и назван по аналогии с трубопроводом. Конвейеры чаще всего используются в shell-скриптах для связи нескольких команд путем перенаправления вывода одной команды (stdout) на вход (stdin) последующей, используя символ конвеера ‘|’:
grep выполняет регистронезависимый поиск строки “error” в файле log, но результат поиска не выводится на экран, а перенаправляется на вход (stdin) команды wc, которая в свою очередь выполняет подсчет количества строк.
Логика
Конвеер обеспечивает асинхронное выполнение команд с использованием буферизации ввода/вывода. Таким образом все команды в конвейере работают параллельно, каждая в своем процессе.
Размер буфера начиная с ядра версии 2.6.11 составляет 65536 байт (64Кб) и равен странице памяти в более старых ядрах. При попытке чтения из пустого буфера процесс чтения блокируется до появления данных. Аналогично при попытке записи в заполненный буфер процесс записи будет заблокирован до освобождения необходимого места.
Важно, что несмотря на то, что конвейер оперирует файловыми дескрипторами потоков ввода/вывода, все операции выполняются в памяти, без нагрузки на диск.
Вся информация, приведенная ниже, касается оболочки bash-4.2 и ядра 3.10.10.
Простой дебаг
Исходный код, уровень 1, shell
Т. к. лучшая документация — исходный код, обратимся к нему. Bash использует Yacc для парсинга входных команд и возвращает ‘command_connect()’, когда встречает символ ‘|’.
parse.y:
Также здесь мы видим обработку пары символов ‘|&’, что эквивалентно перенаправлению как stdout, так и stderr в конвеер. Далее обратимся к command_connect():make_cmd.c:
где connector это символ ‘|’ как int. При выполнении последовательности команд (связанных через ‘&’, ‘|’, ‘;’, и т. д.) вызывается execute_connection():execute_cmd.c:
PIPE_IN и PIPE_OUT — файловые дескрипторы, содержащие информацию о входном и выходном потоках. Они могут принимать значение NO_PIPE, которое означает, что I/O является stdin/stdout.
execute_pipeline() довольно объемная функция, имплементация которой содержится в execute_cmd.c. Мы рассмотрим наиболее интересные для нас части.
execute_cmd.c:
Таким образом, bash обрабатывает символ конвейера путем системного вызова pipe() для каждого встретившегося символа ‘|’ и выполняет каждую команду в отдельном процессе с использованием соответствующих файловых дескрипторов в качестве входного и выходного потоков.
Исходный код, уровень 2, ядро
Обратимся к коду ядра и посмотрим на имплементацию функции pipe(). В статье рассматривается ядро версии 3.10.10 stable.
fs/pipe.c (пропущены незначительные для данной статьи участки кода):
Если вы обратили внимание, в коде идет проверка на флаг O_NONBLOCK. Его можно выставить используя операцию F_SETFL в fcntl. Он отвечает за переход в режим без блокировки I/O потоков в конвеере. В этом режиме вместо блокировки процесс чтения/записи в поток будет завершаться с errno кодом EAGAIN.
Максимальный размер блока данных, который будет записан в конвейер, равен одной странице памяти (4Кб) для архитектуры arm:
arch/arm/include/asm/limits.h:
Для ядер >= 2.6.35 можно изменить размер буфера конвейера:
Максимально допустимый размер буфера, как мы видели выше, указан в файле /proc/sys/fs/pipe-max-size.
Tips & trics
В примерах ниже будем выполнять ls на существующую директорию Documents и два несуществующих файла: ./non-existent_file и. /other_non-existent_file.
Перенаправление и stdout, и stderr в pipe
или же можно использовать комбинацию символов ‘|&’ (о ней можно узнать как из документации к оболочке (man bash), так и из исходников выше, где мы разбирали Yacc парсер bash):
Перенаправление _только_ stderr в pipe
Shoot yourself in the foot
Важно соблюдать порядок перенаправления stdout и stderr. Например, комбинация ‘>/dev/null 2>&1′ перенаправит и stdout, и stderr в /dev/null.
Получение корректного кода завершения конвейра
По умолчанию, код завершения конвейера — код завершения последней команды в конвеере. Например, возьмем исходную команду, которая завершается с ненулевым кодом:
И поместим ее в pipe:
Теперь код завершения конвейера — это код завершения команды wc, т.е. 0.
Обычно же нам нужно знать, если в процессе выполнения конвейера произошла ошибка. Для этого следует выставить опцию pipefail, которая указывает оболочке, что код завершения конвейера будет совпадать с первым ненулевым кодом завершения одной из команд конвейера или же нулю в случае, если все команды завершились корректно:
Shoot yourself in the foot
Следует иметь в виду “безобидные” команды, которые могут вернуть не ноль. Это касается не только работы с конвейерами. Например, рассмотрим пример с grep:
Здесь мы печатаем все найденные строки, приписав ‘new_’ в начале каждой строки, либо не печатаем ничего, если ни одной строки нужного формата не нашлось. Проблема в том, что grep завершается с кодом 1, если не было найдено ни одного совпадения, поэтому если в нашем скрипте выставлена опция pipefail, этот пример завершится с кодом 1:
В больших скриптах со сложными конструкциями и длинными конвеерами можно упустить этот момент из виду, что может привести к некорректным результатам.
Источник
Организация взаимодействия процессов через pipe и FIFO в UNIX
Понятие о pipe. Системный вызов pipe()
Наиболее простым способом для передачи информации с помощью потоковой модели между различными процессами или даже внутри одного процесса в операционной системе UNIX является pipe (канал, труба, конвейер).
Важное отличие pip’а от файла заключается в том, что прочитанная информация немедленно удаляется из него и не может быть прочитана повторно.
Pipe можно представить себе в виде трубы ограниченной емкости, расположенной внутри адресного пространства операционной системы, доступ к входному и выходному отверстию которой осуществляется с помощью системных вызовов. В действительности pipe представляет собой область памяти, недоступную пользовательским процессам напрямую, зачастую организованную в виде кольцевого буфера (хотя существуют и другие виды организации). По буферу при операциях чтения и записи перемещаются два указателя, соответствующие входному и выходному потокам. При этом выходной указатель никогда не может перегнать входной и наоборот. Для создания нового экземпляра такого кольцевого буфера внутри операционной системы используется системный вызов pipe () .
Системный вызов pipe
Прототип системного вызова
Описание системного вызова
Системный вызов pipe предназначен для создания pip ‘а внутри операционной системы.
Параметр fd является указателем на массив из двух целых переменных. При нормальном завершении вызова в первый элемент массива – fd[0] – будет занесен файловый дескриптор, соответствующий выходному потоку данных pip ’а и позволяющий выполнять только операцию чтения, а во второй элемент массива – fd[1] – будет занесен файловый дескриптор, соответствующий входному потоку данных и позволяющий выполнять только операцию записи.
Системный вызов возвращает значение 0 при нормальном завершении и значение -1 при возникновении ошибок.
В процессе работы системный вызов организует выделение области памяти под буфер и указатели и заносит информацию, соответствующую входному и выходному потокам данных, в два элемента таблицы открытых файлов , связывая тем самым с каждым pip ’ом два файловых дескриптора . Для одного из них разрешена только операция чтения из pip ’а, а для другого – только операция записи в pipe . Для выполнения этих операций мы можем использовать те же самые системные вызовы read() и write() , что и при работе с файлами. Естественно, по окончании использования входного или/и выходного потока данных, нужно закрыть соответствующий поток с помощью системного вызова close() для освобождения системных ресурсов. Необходимо отметить, что, когда все процессы, использующие pipe , закрывают все ассоциированные с ним файловые дескрипторы , операционная система ликвидирует pipe . Таким образом, время существования pip ’а в системе не может превышать время жизни процессов, работающих с ним.
Прогон программы для pipe в одном процессе
Достаточно яркой иллюстрацией действий по созданию pip ‘a, записи в него данных, чтению из него и освобождению выделенных ресурсов может служить программа , организующая работу с pip ’ом в рамках одного процесса, приведенная ниже:
Наберите программу, откомпилируйте ее и запустите на исполнение .
Организация связи через pipe между процессом-родителем и процессом-потомком. Наследование файловых дескрипторов при вызовах fork() и exec()
Понятно, что если бы все достоинство pip ‘ов сводилось к замене функции копирования из памяти в память внутри одного процесса на пересылку информации через операционную систему, то овчинка не стоила бы выделки. Однако таблица открытых файлов наследуется процессом-ребенком при порождении нового процесса системным вызовом fork() и входит в состав неизменяемой части системного контекста процесса при системном вызове exec() (за исключением тех потоков данных, для файловых дескрипторов которых был специальными средствами выставлен признак, побуждающий операционную систему закрыть их при выполнении exec() , однако их рассмотрение выходит за рамки нашего курса). Это обстоятельство позволяет организовать передачу информации через pipe между родственными процессами, имеющими общего прародителя, создавшего pipe .
Прогон программы для организации однонаправленной связи между родственными процессами через pipe
Давайте рассмотрим программу, осуществляющую однонаправленную связь между процессом-родителем и процессом-ребенком:
Наберите программу, откомпилируйте ее и запустите на исполнение .
Задача повышенной сложности: модифицируйте этот пример для связи между собой двух родственных процессов, исполняющих разные программы.
Источник
Модуль child_process¶
В child_process Модуль предоставляет возможность создавать подпроцессы аналогично, но не идентично popen (3). Эта возможность в первую очередь обеспечивается child_process.spawn() функция:
По умолчанию трубы для stdin , stdout , а также stderr устанавливаются между родительским процессом Node.js и порожденным подпроцессом. Эти трубы имеют ограниченную (и зависящую от платформы) пропускную способность. Если подпроцесс записывает в stdout сверх этого предела без захвата вывода, подпроцесс блокируется, ожидая, пока буфер канала примет больше данных. Это идентично поведению труб в оболочке. Использовать < stdio: 'ignore' >вариант, если выход не будет израсходован.
Поиск команд выполняется с помощью options.env.PATH переменная окружения, если она находится в options объект. Иначе, process.env.PATH используется.
В Windows переменные среды нечувствительны к регистру. Node.js лексикографически сортирует env ключи и использует первый, совпадающий без учета регистра. Подпроцессу будет передана только первая (в лексикографическом порядке) запись. Это может привести к проблемам в Windows при передаче объектов в env вариант, который имеет несколько вариантов одного и того же ключа, например PATH а также Path .
В child_process.spawn() метод асинхронно порождает дочерний процесс, не блокируя цикл событий Node.js. В child_process.spawnSync() Функция обеспечивает эквивалентную функциональность в синхронном режиме, которая блокирует цикл событий до тех пор, пока порожденный процесс не завершится или не завершится.
Для удобства child_process модуль предоставляет несколько синхронных и асинхронных альтернатив child_process.spawn() а также child_process.spawnSync() . Каждая из этих альтернатив реализована поверх child_process.spawn() или child_process.spawnSync() .
- child_process.exec() : порождает оболочку и запускает команду в этой оболочке, передавая stdout а также stderr в функцию обратного вызова по завершении.
- child_process.execFile() : похожий на child_process.exec() за исключением того, что он порождает команду напрямую, без предварительного создания оболочки по умолчанию.
- child_process.fork() : порождает новый процесс Node.js и вызывает указанный модуль с установленным каналом связи IPC, который позволяет отправлять сообщения между родителем и потомком.
- child_process.execSync() : синхронная версия child_process.exec() который заблокирует цикл событий Node.js.
- child_process.execFileSync() : синхронная версия child_process.execFile() который заблокирует цикл событий Node.js.
Для определенных случаев использования, таких как автоматизация сценариев оболочки, синхронные аналоги может быть удобнее. Однако во многих случаях синхронные методы могут существенно повлиять на производительность из-за остановки цикла событий во время завершения порожденных процессов.
Создание асинхронного процесса¶
В child_process.spawn() , child_process.fork() , child_process.exec() , а также child_process.execFile() все методы следуют идиоматическому шаблону асинхронного программирования, типичному для других API-интерфейсов Node.js.
Каждый из методов возвращает ChildProcess пример. Эти объекты реализуют Node.js EventEmitter API, позволяющий родительскому процессу регистрировать функции прослушивателя, которые вызываются при возникновении определенных событий в течение жизненного цикла дочернего процесса.
В child_process.exec() а также child_process.execFile() методы дополнительно допускают необязательный callback должна быть указана функция, которая вызывается при завершении дочернего процесса.
Нерест .bat а также .cmd файлы в Windows¶
Важность различия между child_process.exec() а также child_process.execFile() может отличаться в зависимости от платформы. В операционных системах типа Unix (Unix, Linux, macOS) child_process.execFile() может быть более эффективным, потому что по умолчанию он не порождает оболочку. Однако в Windows .bat а также .cmd файлы не могут быть выполнены сами по себе без терминала, и поэтому не могут быть запущены с помощью child_process.execFile() . При работе в Windows .bat а также .cmd файлы могут быть вызваны с помощью child_process.spawn() с shell набор опций, с child_process.exec() , или путем нереста cmd.exe и прохождение .bat или .cmd файл в качестве аргумента (это то, что shell вариант и child_process.exec() делать). В любом случае, если имя файла сценария содержит пробелы, его необходимо заключить в кавычки.
child_process.exec(command[, options][, callback]) ¶
- command <строка>Команда для запуска с аргументами, разделенными пробелами.
- options
- cwd
Текущий рабочий каталог дочернего процесса. Дефолт: process.cwd() . - env
- encoding <нить>Дефолт: ‘utf8’
- shell <строка>Оболочка для выполнения команды. Видеть Требования к оболочке а также Оболочка Windows по умолчанию. Дефолт: ‘/bin/sh’ в Unix, process.env.ComSpec в Windows.
- signal
позволяет прервать дочерний процесс с помощью AbortSignal. - timeout <количество>Дефолт: 0
- maxBuffer
Наибольший объем данных в байтах, разрешенный для stdout или stderr. При превышении дочерний процесс завершается, а любой вывод обрезается. См. Предостережение на maxBuffer и Юникод. Дефолт: 1024 * 1024 . - killSignal <строка | целое число>Дефолт: ‘SIGTERM’
- uid
Устанавливает идентификатор пользователя процесса (см. setuid (2)). - gid
Устанавливает групповой идентификатор процесса (см. setgid (2)). - windowsHide
Скрыть окно консоли подпроцесса, которое обычно создается в системах Windows. Дефолт: false . - callback <Функция>вызывается с выходом, когда процесс завершается.
- error
- stdout
- stderr
- Возвращает:
Создает оболочку, затем выполняет command внутри этой оболочки, буферизуя любой сгенерированный вывод. В command строка, переданная в функцию exec, обрабатывается непосредственно оболочкой и специальными символами (различаются в зависимости от оболочка) необходимо поступить соответствующим образом:
Никогда не передавайте в эту функцию вводимые пользователем данные без предварительной очистки. Любой ввод, содержащий метасимволы оболочки, может использоваться для запуска произвольного выполнения команды.
Если callback предоставляется функция, она вызывается с аргументами (error, stdout, stderr) . При успехе error будет null . При ошибке error будет примером Error . В error.code Свойство будет кодом выхода из процесса. По соглашению любой код выхода, кроме 0 указывает на ошибку. error.signal будет сигналом о завершении процесса.
В stdout а также stderr аргументы, переданные в обратный вызов, будут содержать выходные данные stdout и stderr дочернего процесса. По умолчанию Node.js декодирует вывод как UTF-8 и передает строки в обратный вызов. В encoding Параметр может использоваться для указания кодировки символов, используемой для декодирования вывода stdout и stderr. Если encoding является ‘buffer’ , или нераспознанная кодировка символов, Buffer вместо этого объекты будут переданы в обратный вызов.
Если timeout больше, чем 0 , родитель отправит сигнал, идентифицированный killSignal свойство (по умолчанию ‘SIGTERM’ ) если ребенок бежит дольше, чем timeout миллисекунды.
В отличие от системного вызова POSIX exec (3), child_process.exec() не заменяет существующий процесс и использует оболочку для выполнения команды.
Если этот метод вызывается как его util.promisify() ed версия, он возвращает Promise для Object с участием stdout а также stderr характеристики. Вернувшийся ChildProcess экземпляр прикреплен к Promise как child имущество. В случае ошибки (включая любую ошибку, приводящую к коду выхода, отличному от 0), возвращается отклоненное обещание с тем же error объект, указанный в обратном вызове, но с двумя дополнительными свойствами stdout а также stderr .
Если signal опция включена, звонок .abort() на соответствующем AbortController похоже на вызов .kill() в дочернем процессе, за исключением того, что ошибка, переданная в обратный вызов, будет AbortError :
child_process.execFile(file[, args][, options][, callback]) ¶
- file <строка>Имя или путь исполняемого файла для запуска.
- args
Список строковых аргументов. - options
- cwd
Текущий рабочий каталог дочернего процесса. - env
- encoding <нить>Дефолт: ‘utf8’
- timeout <количество>Дефолт: 0
- maxBuffer
Наибольший объем данных в байтах, разрешенный для stdout или stderr. При превышении дочерний процесс завершается, а любой вывод обрезается. См. Предостережение на maxBuffer и Юникод. Дефолт: 1024 * 1024 . - killSignal <строка | целое число>Дефолт: ‘SIGTERM’
- uid
Устанавливает идентификатор пользователя процесса (см. setuid (2)). - gid
Устанавливает групповой идентификатор процесса (см. setgid (2)). - windowsHide
Скрыть окно консоли подпроцесса, которое обычно создается в системах Windows. Дефолт: false . - windowsVerbatimArguments
В Windows не используются кавычки или экранирование аргументов. Игнорируется в Unix. Дефолт: false . - shell <логическое | строка>Если true , работает command внутри оболочки. Использует ‘/bin/sh’ в Unix и process.env.ComSpec в Windows. Другая оболочка может быть указана в виде строки. Видеть Требования к оболочке а также Оболочка Windows по умолчанию. Дефолт: false (без оболочки).
- signal
позволяет прервать дочерний процесс с помощью AbortSignal. - callback <Функция>Вызывается с выходом, когда процесс завершается.
- error
- stdout
- stderr
- Возвращает:
В child_process.execFile() функция похожа на child_process.exec() за исключением того, что по умолчанию он не порождает оболочку. Скорее, указанный исполняемый файл file создается непосредственно как новый процесс, что делает его немного более эффективным, чем child_process.exec() .
Те же варианты, что и child_process.exec() поддерживаются. Поскольку оболочка не создается, такие действия, как перенаправление ввода-вывода и подстановка файлов, не поддерживаются.
В stdout а также stderr аргументы, переданные в обратный вызов, будут содержать выходные данные stdout и stderr дочернего процесса. По умолчанию Node.js декодирует вывод как UTF-8 и передает строки в обратный вызов. В encoding Параметр может использоваться для указания кодировки символов, используемой для декодирования вывода stdout и stderr. Если encoding является ‘buffer’ , или нераспознанная кодировка символов, Buffer вместо этого объекты будут переданы в обратный вызов.
Если этот метод вызывается как его util.promisify() ed версия, он возвращает Promise для Object с участием stdout а также stderr характеристики. Вернувшийся ChildProcess экземпляр прикреплен к Promise как child имущество. В случае ошибки (включая любую ошибку, приводящую к коду выхода, отличному от 0), возвращается отклоненное обещание с тем же error объект, указанный в обратном вызове, но с двумя дополнительными свойствами stdout а также stderr .
Если shell опция включена, не передавайте в эту функцию несанкционированные данные, введенные пользователем. Любой ввод, содержащий метасимволы оболочки, может использоваться для запуска произвольного выполнения команды.
Если signal опция включена, звонок .abort() на соответствующем AbortController похоже на вызов .kill() в дочернем процессе, за исключением того, что ошибка, переданная в обратный вызов, будет AbortError :
child_process.fork(modulePath[, args][, options]) ¶
- modulePath <строка>Модуль для запуска в дочернем элементе.
- args
Список строковых аргументов. - options
- cwd
Текущий рабочий каталог дочернего процесса. - detached
Подготовить дочерний процесс к запуску независимо от его родительского процесса. Конкретное поведение зависит от платформы, см. options.detached ). - env
- execPath <строка>Исполняемый файл, используемый для создания дочернего процесса.
- execArgv
Список строковых аргументов, переданных исполняемому файлу. Дефолт: process.execArgv . - gid
Устанавливает групповой идентификатор процесса (см. setgid (2)). - serialization <строка>Укажите тип сериализации, используемый для отправки сообщений между процессами. Возможные значения: ‘json’ а также ‘advanced’ . Видеть Расширенная сериализация Больше подробностей. Дефолт: ‘json’ .
- signal
Позволяет закрыть дочерний процесс с помощью AbortSignal. - killSignal <строка | целое число>Значение сигнала, которое будет использоваться, когда порожденный процесс будет остановлен по таймауту или сигналу прерывания. Дефолт: ‘SIGTERM’ .
- silent
Если true , stdin, stdout и stderr дочернего элемента будут переданы по конвейеру родителю, в противном случае они будут унаследованы от родителя, см. ‘pipe’ а также ‘inherit’ варианты для child_process.spawn() с stdio Больше подробностей. Дефолт: false . - stdio
См. child_process.spawn() с stdio . Когда предоставляется этот параметр, он имеет приоритет над silent . Если используется вариант массива, он должен содержать ровно один элемент со значением ‘ipc’ или будет выдана ошибка. Например [0, 1, 2, ‘ipc’] . - uid
Устанавливает идентификатор пользователя процесса (см. setuid (2)). - windowsVerbatimArguments
В Windows не используются кавычки или экранирование аргументов. Игнорируется в Unix. Дефолт: false . - timeout
Максимальное время, в течение которого процесс может выполняться, в миллисекундах. Дефолт: undefined . - Возвращает:
В child_process.fork() метод является частным случаем child_process.spawn() используется специально для создания новых процессов Node.js. Нравиться child_process.spawn() , а ChildProcess объект возвращается. Вернувшийся ChildProcess будет иметь встроенный дополнительный канал связи, который позволяет передавать сообщения между родителем и потомком. Видеть subprocess.send() для подробностей.
Имейте в виду, что порожденные дочерние процессы Node.js не зависят от родителя, за исключением канала связи IPC, установленного между ними. Каждый процесс имеет свою собственную память со своими собственными экземплярами V8. Из-за необходимости выделения дополнительных ресурсов создание большого количества дочерних процессов Node.js не рекомендуется.
По умолчанию, child_process.fork() создаст новые экземпляры Node.js, используя process.execPath родительского процесса. В execPath собственность в options объект позволяет использовать альтернативный путь выполнения.
Процессы Node.js, запущенные с настраиваемым execPath будет взаимодействовать с родительским процессом, используя дескриптор файла (fd), идентифицированный с помощью переменной среды NODE_CHANNEL_FD о дочернем процессе.
В отличие от системного вызова POSIX fork (2), child_process.fork() не клонирует текущий процесс.
В shell опция доступна в child_process.spawn() не поддерживается child_process.fork() и будет проигнорирован, если установлен.
Если signal опция включена, звонок .abort() на соответствующем AbortController похоже на вызов .kill() в дочернем процессе, за исключением того, что ошибка, переданная в обратный вызов, будет AbortError :
child_process.spawn(command[, args][, options]) ¶
command <строка>Команда для выполнения.
args
cwd
killSignal <строка | целое число>Значение сигнала, которое будет использоваться, когда порожденный процесс будет остановлен по таймауту или сигналу прерывания. Дефолт: ‘SIGTERM’ .
В child_process.spawn() метод порождает новый процесс, используя данный command , с аргументами командной строки в args . Если опущено, args по умолчанию пустой массив.
Если shell опция включена, не передавайте в эту функцию несанкционированные данные, введенные пользователем. Любой ввод, содержащий метасимволы оболочки, может использоваться для запуска произвольного выполнения команды.
Третий аргумент может использоваться для указания дополнительных параметров со следующими значениями по умолчанию:
Использовать cwd чтобы указать рабочий каталог, из которого запускается процесс. Если не указан, по умолчанию наследуется текущий рабочий каталог. Если задан, но путь не существует, дочерний процесс выдает сообщение ENOENT ошибка и немедленно закрывается. ENOENT также выдается, когда команда не существует.
Использовать env для указания переменных среды, которые будут видны новому процессу, по умолчанию используется process.env .
undefined ценности в env будут проигнорированы.
Пример запуска ls -lh /usr , захват stdout , stderr , и код выхода:
Пример: очень сложный способ запуска ps ax | grep ssh
Пример проверки на сбой spawn :
Некоторые платформы (macOS, Linux) будут использовать значение argv[0] для названия процесса, в то время как другие (Windows, SunOS) будут использовать command .
Node.js в настоящее время перезаписывает argv[0] с участием process.execPath при запуске, так что process.argv[0] в дочернем процессе Node.js не будет соответствовать argv0 параметр передан в spawn от родителя, извлеките его с помощью process.argv0 свойство вместо этого.
Если signal опция включена, звонок .abort() на соответствующем AbortController похоже на вызов .kill() в дочернем процессе, за исключением того, что ошибка, переданная в обратный вызов, будет AbortError :
options.detached ¶
В Windows установка options.detached к true позволяет дочернему процессу продолжить работу после выхода из родительского. У ребенка будет собственное окно консоли. После включения для дочернего процесса его нельзя отключить.
На платформах, отличных от Windows, если options.detached установлен на true , дочерний процесс станет лидером новой группы процессов и сеанса. Дочерние процессы могут продолжать работу после выхода из родительского, независимо от того, отсоединены они или нет. См. Setsid (2) для получения дополнительной информации.
По умолчанию родитель будет ждать выхода отсоединенного дочернего элемента. Чтобы родители не ждали заданного subprocess для выхода используйте subprocess.unref() метод. Это приведет к тому, что родительский цикл событий не включит дочерний элемент в свой счетчик ссылок, что позволит родителю выйти независимо от дочернего элемента, если между дочерним и родительским элементом не будет установлен канал IPC.
При использовании detached возможность запустить длительный процесс, процесс не будет продолжать работать в фоновом режиме после выхода родительского объекта, если ему не будет предоставлен stdio конфигурация, которая не связана с родительским. Если родитель stdio наследуется, потомок останется присоединенным к управляющему терминалу.
Пример длительного процесса с отключением и игнорированием его родителя stdio файловые дескрипторы, чтобы игнорировать завершение родителя:
В качестве альтернативы можно перенаправить вывод дочернего процесса в файлы:
options.stdio ¶
В options.stdio опция используется для настройки каналов, которые устанавливаются между родительским и дочерним процессом. По умолчанию дочерние stdin, stdout и stderr перенаправляются на соответствующие subprocess.stdin , subprocess.stdout , а также subprocess.stderr потоки на ChildProcess объект. Это эквивалентно установке options.stdio равно [‘pipe’, ‘pipe’, ‘pipe’] .
Для удобства, options.stdio может быть одной из следующих строк:
- ‘pipe’ : эквивалентно [‘pipe’, ‘pipe’, ‘pipe’] (по умолчанию)
- ‘overlapped’ : эквивалентно [‘overlapped’, ‘overlapped’, ‘overlapped’]
- ‘ignore’ : эквивалентно [‘ignore’, ‘ignore’, ‘ignore’]
- ‘inherit’ : эквивалентно [‘inherit’, ‘inherit’, ‘inherit’] или [0, 1, 2]
В противном случае значение options.stdio — это массив, в котором каждый индекс соответствует fd в дочернем элементе. Fds 0, 1 и 2 соответствуют стандартному вводу, стандартному выводу и стандартному потоку данных соответственно. Дополнительные fds могут быть указаны для создания дополнительных каналов между родителем и потомком. Значение может быть одним из следующих:
- ‘pipe’ : Создать канал между дочерним и родительским процессами. Родительский конец канала предоставляется родительскому элементу как свойство в child_process объект как subprocess.stdio[fd] . Каналы, созданные для fds 0, 1 и 2, также доступны как subprocess.stdin , subprocess.stdout а также subprocess.stderr , соответственно.
- ‘overlapped’ : Такой же как ‘pipe’ за исключением того, что FILE_FLAG_OVERLAPPED на ручке установлен флажок. Это необходимо для перекрывающегося ввода-вывода дескрипторов stdio дочернего процесса. Увидеть документы Больше подробностей. Это точно так же, как ‘pipe’ в системах, отличных от Windows.
‘ipc’ : Создайте канал IPC для передачи сообщений / файловых дескрипторов между родительским и дочерним. А ChildProcess может иметь не более одного дескриптора файла IPC stdio. Установка этого параметра включает subprocess.send() метод. Если дочерний процесс является процессом Node.js, наличие канала IPC позволит process.send() а также process.disconnect() методы, а также ‘disconnect’ а также ‘message’ события внутри ребенка.
Доступ к IP-каналу fd любым способом, кроме process.send() или использование канала IPC с дочерним процессом, не являющимся экземпляром Node.js, не поддерживается.
‘ignore’ : Указывает Node.js игнорировать fd в дочернем элементе. Хотя Node.js всегда будет открывать fds 0, 1 и 2 для процессов, которые он порождает, установив для fd значение ‘ignore’ вызовет открытие Node.js /dev/null и прикрепите его к детскому fd.
Стоит отметить, что когда между родительским и дочерним процессами устанавливается канал IPC, а дочерний процесс является процессом Node.js, дочерний процесс запускается с каналом IPC без ссылки (с использованием unref() ) до тех пор, пока дочерний элемент не зарегистрирует обработчик событий для ‘disconnect’ событие или ‘message’ событие. Это позволяет дочернему элементу нормально выйти без того, чтобы процесс был открыт открытым каналом IPC.
В Unix-подобных операционных системах child_process.spawn() выполняет операции с памятью синхронно перед тем, как отделить цикл событий от дочернего. Приложения с большим объемом памяти могут часто child_process.spawn() призывает быть узким местом. Для получения дополнительной информации см. V8, выпуск 7381.
Создание синхронного процесса¶
В child_process.spawnSync() , child_process.execSync() , а также child_process.execFileSync() методы являются синхронными и будут блокировать цикл событий Node.js, приостанавливая выполнение любого дополнительного кода до завершения порожденного процесса.
Блокирующие вызовы, подобные этим, в основном полезны для упрощения задач сценариев общего назначения и для упрощения загрузки / обработки конфигурации приложения при запуске.
child_process.execFileSync(file[, args][, options]) ¶
- file <строка>Имя или путь исполняемого файла для запуска.
- args
Список строковых аргументов. - options
- cwd
Текущий рабочий каталог дочернего процесса. - input
Значение, которое будет передано как стандартный ввод в порожденный процесс. Предоставление этого значения переопределит stdio[0] . - stdio
Конфигурация дочернего stdio. stderr по умолчанию будет выводиться на stderr родительского процесса, если stdio указан. Дефолт: ‘pipe’ . - env
- uid
Устанавливает идентификатор пользователя процесса (см. setuid (2)). - gid
Устанавливает групповой идентификатор процесса (см. setgid (2)). - timeout
Максимальное время, в течение которого процесс может выполняться, в миллисекундах. Дефолт: undefined . - killSignal <строка | целое число>Значение сигнала, которое будет использоваться, когда порожденный процесс будет убит. Дефолт: ‘SIGTERM’ .
- maxBuffer
Наибольший объем данных в байтах, разрешенный для stdout или stderr. При превышении дочерний процесс завершается. См. Предостережение на maxBuffer и Юникод. Дефолт: 1024 * 1024 . - encoding <строка>Кодировка, используемая для всех входов и выходов stdio. Дефолт: ‘buffer’ .
- windowsHide
Скрыть окно консоли подпроцесса, которое обычно создается в системах Windows. Дефолт: false . - shell <логическое | строка>Если true , работает command внутри оболочки. Использует ‘/bin/sh’ в Unix и process.env.ComSpec в Windows. Другая оболочка может быть указана в виде строки. Видеть Требования к оболочке а также Оболочка Windows по умолчанию. Дефолт: false (без оболочки).
- Возвращает:
Стандартный вывод команды.
В child_process.execFileSync() метод в целом идентичен child_process.execFile() за исключением того, что метод не вернется, пока дочерний процесс не закроется полностью. Когда истекло время ожидания и killSignal отправлено, метод не вернется, пока процесс не завершится полностью.
Если дочерний процесс перехватывает и обрабатывает SIGTERM сигнал и не завершается, родительский процесс все равно будет ждать, пока дочерний процесс не завершится.
Если время ожидания процесса истекло или код выхода отличен от нуля, этот метод выдаст сообщение Error который будет включать в себя полный результат базового child_process.spawnSync() .
Если shell опция включена, не передавайте в эту функцию несанкционированные данные, введенные пользователем. Любой ввод, содержащий метасимволы оболочки, может использоваться для запуска произвольного выполнения команды.
child_process.execSync(command[, options]) ¶
- command <строка>Команда для выполнения.
- options
- cwd
Текущий рабочий каталог дочернего процесса. - input
Значение, которое будет передано как стандартный ввод в порожденный процесс. Предоставление этого значения переопределит stdio[0] . - stdio
Конфигурация дочернего stdio. stderr по умолчанию будет выводиться на stderr родительского процесса, если stdio указан. Дефолт: ‘pipe’ . - env
- shell <строка>Оболочка для выполнения команды. Видеть Требования к оболочке а также Оболочка Windows по умолчанию. Дефолт: ‘/bin/sh’ в Unix, process.env.ComSpec в Windows.
- uid
Устанавливает идентификатор пользователя процесса. (См. Setuid (2)). - gid
Устанавливает групповой идентификатор процесса. (См. Setgid (2)). - timeout
Максимальное время, в течение которого процесс может выполняться, в миллисекундах. Дефолт: undefined . - killSignal <строка | целое число>Значение сигнала, которое будет использоваться, когда порожденный процесс будет убит. Дефолт: ‘SIGTERM’ .
- maxBuffer
Наибольший объем данных в байтах, разрешенный для stdout или stderr. При превышении дочерний процесс завершается, а любой вывод обрезается. См. Предостережение на maxBuffer и Юникод. Дефолт: 1024 * 1024 . - encoding <строка>Кодировка, используемая для всех входов и выходов stdio. Дефолт: ‘buffer’ .
- windowsHide
Скрыть окно консоли подпроцесса, которое обычно создается в системах Windows. Дефолт: false . - Возвращает:
Стандартный вывод команды.
В child_process.execSync() метод в целом идентичен child_process.exec() за исключением того, что метод не вернется, пока дочерний процесс не закроется полностью. Когда истекло время ожидания и killSignal отправлено, метод не вернется, пока процесс не завершится полностью. Если дочерний процесс перехватывает и обрабатывает SIGTERM сигнал и не завершается, родительский процесс будет ждать, пока дочерний процесс не завершится.
Если время ожидания процесса истекло или код выхода отличен от нуля, этот метод вызовет ошибку. В Error объект будет содержать весь результат из child_process.spawnSync() .
Никогда не передавайте в эту функцию вводимые пользователем данные без предварительной очистки. Любой ввод, содержащий метасимволы оболочки, может использоваться для запуска произвольного выполнения команды.
child_process.spawnSync(command[, args][, options]) ¶
- command <строка>Команда для выполнения.
- args
Список строковых аргументов. - options
- cwd
Текущий рабочий каталог дочернего процесса. - input
Значение, которое будет передано как стандартный ввод в порожденный процесс. Предоставление этого значения переопределит stdio[0] . - argv0 <строка>Явно задайте значение argv[0] отправлено дочернему процессу. Это будет установлено на command если не указано.
- stdio
Конфигурация дочернего stdio. - env
- uid
Устанавливает идентификатор пользователя процесса (см. setuid (2)). - gid
Устанавливает групповой идентификатор процесса (см. setgid (2)). - timeout
Максимальное время, в течение которого процесс может выполняться, в миллисекундах. Дефолт: undefined . - killSignal <строка | целое число>Значение сигнала, которое будет использоваться, когда порожденный процесс будет убит. Дефолт: ‘SIGTERM’ .
- maxBuffer
Наибольший объем данных в байтах, разрешенный для stdout или stderr. При превышении дочерний процесс завершается, а любой вывод обрезается. См. Предостережение на maxBuffer и Юникод. Дефолт: 1024 * 1024 . - encoding <строка>Кодировка, используемая для всех входов и выходов stdio. Дефолт: ‘buffer’ .
- shell <логическое | строка>Если true , работает command внутри оболочки. Использует ‘/bin/sh’ в Unix и process.env.ComSpec в Windows. Другая оболочка может быть указана в виде строки. Видеть Требования к оболочке а также Оболочка Windows по умолчанию. Дефолт: false (без оболочки).
- windowsVerbatimArguments
В Windows не используются кавычки или экранирование аргументов. Игнорируется в Unix. Это установлено на true автоматически, когда shell указан и является CMD. Дефолт: false . - windowsHide
Скрыть окно консоли подпроцесса, которое обычно создается в системах Windows. Дефолт: false . - Возвращает:
- pid
Pid дочернего процесса. - output
Массив результатов вывода stdio. - stdout
Содержимое output[1] . - stderr
Содержимое output[2] . - status
Код выхода подпроцесса, или null если подпроцесс завершился из-за сигнала. - signal
Сигнал, используемый для завершения подпроцесса, или null если подпроцесс не завершился из-за сигнала. - error
Объект ошибки, если дочерний процесс завершился ошибкой или истекло время ожидания.
В child_process.spawnSync() метод в целом идентичен child_process.spawn() за исключением того, что функция не вернется, пока дочерний процесс не закроется полностью. Когда истекло время ожидания и killSignal отправлено, метод не вернется, пока процесс не завершится полностью. Если процесс перехватывает и обрабатывает SIGTERM сигнал и не завершается, родительский процесс будет ждать, пока дочерний процесс не завершится.
Если shell опция включена, не передавайте в эту функцию несанкционированные данные, введенные пользователем. Любой ввод, содержащий метасимволы оболочки, может использоваться для запуска произвольного выполнения команды.
Класс: ChildProcess ¶
Экземпляры ChildProcess представляют порожденные дочерние процессы.
Экземпляры ChildProcess не предназначены для непосредственного создания. Скорее используйте child_process.spawn() , child_process.exec() , child_process.execFile() , или child_process.fork() методы для создания экземпляров ChildProcess .
Событие: ‘close’ ¶
- code
Код выхода, если дочерний элемент вышел сам. - signal <строка>Сигнал, по которому был завершен дочерний процесс.
В ‘close’ событие генерируется после завершения процесса а также потоки stdio дочернего процесса были закрыты. Это отличается от ‘exit’ событие, поскольку несколько процессов могут использовать одни и те же потоки stdio. В ‘close’ событие всегда будет генерироваться после ‘exit’ уже был отправлен, или ‘error’ если ребенок не появился.
Событие: ‘disconnect’ ¶
В ‘disconnect’ событие испускается после вызова subprocess.disconnect() метод в родительском процессе или process.disconnect() в дочернем процессе. После отключения больше нельзя отправлять или получать сообщения, и subprocess.connected собственность false .
Событие: ‘error’ ¶
В ‘error’ событие генерируется всякий раз, когда:
- Процесс не может быть запущен, или
- Процесс не может быть остановлен, или
- Не удалось отправить сообщение дочернему процессу.
В ‘exit’ событие может или не может сработать после того, как произошла ошибка. При прослушивании как ‘exit’ а также ‘error’ событий, защитите от случайного многократного вызова функций-обработчиков.
Событие: ‘exit’ ¶
- code
Код выхода, если дочерний элемент вышел сам. - signal <строка>Сигнал, по которому был завершен дочерний процесс.
В ‘exit’ событие генерируется после завершения дочернего процесса. Если процесс завершился, code это последний код выхода из процесса, в противном случае null . Если процесс завершился из-за получения сигнала, signal это строковое имя сигнала, иначе null . Один из двух всегда будет не null .
Когда ‘exit’ событие запускается, потоки stdio дочернего процесса все еще могут быть открыты.
Node.js устанавливает обработчики сигналов для SIGINT а также SIGTERM и процессы Node.js не будут немедленно завершены из-за получения этих сигналов. Скорее, Node.js выполнит последовательность действий по очистке, а затем повторно вызовет обработанный сигнал.
Событие: ‘message’ ¶
- message
- sendHandle
A net.Socket или net.Server объект или неопределенный.
В ‘message’ событие запускается, когда дочерний процесс использует process.send() для отправки сообщений.
Сообщение проходит сериализацию и синтаксический анализ. Полученное сообщение может отличаться от исходного.
Если serialization опция была установлена на ‘advanced’ используется при порождении дочернего процесса, message Аргумент может содержать данные, которые JSON не может представить. Видеть Расширенная сериализация Больше подробностей.
Событие: ‘spawn’ ¶
В ‘spawn’ Событие генерируется после успешного создания дочернего процесса. Если дочерний процесс не запускается успешно, ‘spawn’ событие не генерируется и ‘error’ вместо этого генерируется событие.
Если испускается, ‘spawn’ событие происходит перед всеми другими событиями и до получения каких-либо данных через stdout или stderr .
В ‘spawn’ событие будет срабатывать независимо от того, произошла ли ошибка в порожденный процесс. Например, если bash some-command успешно нерестится, ‘spawn’ событие сработает, хотя bash может не появиться some-command . Это предостережение также применяется при использовании < shell: true >.
subprocess.channel ¶
В subprocess.channel Свойство — это ссылка на дочерний канал IPC. Если в настоящее время канал IPC не существует, это свойство undefined .
subprocess.channel.ref() ¶
Этот метод заставляет канал IPC поддерживать цикл событий родительского процесса, если .unref() был вызван раньше.
subprocess.channel.unref() ¶
Этот метод заставляет канал IPC не поддерживать цикл обработки событий родительского процесса и позволяет ему завершиться, даже когда канал открыт.
subprocess.connected ¶
Установить на false после subprocess.disconnect() называется.
В subprocess.connected указывает, можно ли по-прежнему отправлять и получать сообщения от дочернего процесса. Когда subprocess.connected является false , больше нельзя отправлять или получать сообщения.
subprocess.disconnect() ¶
Закрывает канал IPC между родительским и дочерним объектами, позволяя дочернему элементу корректно выйти, если нет других соединений, поддерживающих его работу. После вызова этого метода subprocess.connected а также process.connected свойства как в родительском, так и в дочернем (соответственно) будут установлены на false , и больше нельзя будет передавать сообщения между процессами.
В ‘disconnect’ событие будет сгенерировано, если в процессе приема нет сообщений. Чаще всего это срабатывает сразу после звонка subprocess.disconnect() .
Когда дочерний процесс является экземпляром Node.js (например, порожден с использованием child_process.fork() ), process.disconnect() Метод может быть вызван в дочернем процессе, чтобы закрыть канал IPC.
subprocess.exitCode ¶
В subprocess.exitCode указывает код выхода дочернего процесса. Если дочерний процесс все еще запущен, поле будет null .
subprocess.kill([signal]) ¶
В subprocess.kill() метод отправляет сигнал дочернему процессу. Если аргумент не указан, процессу будет отправлено сообщение ‘SIGTERM’ сигнал. См. Signal (7) для получения списка доступных сигналов. Эта функция возвращает true если kill (2) успешно, и false иначе.
В ChildProcess объект может излучать ‘error’ событие, если сигнал не может быть доставлен. Отправка сигнала дочернему процессу, который уже завершился, не является ошибкой, но может иметь непредвиденные последствия. В частности, если идентификатор процесса (PID) был переназначен другому процессу, вместо этого сигнал будет доставлен этому процессу, что может привести к неожиданным результатам.
Пока функция вызывается kill , сигнал, доставленный дочернему процессу, может фактически не завершить процесс.
Смотрите kill (2) для справки.
В Windows, где сигналы POSIX не существуют, signal аргумент будет проигнорирован, и процесс будет прекращен принудительно и внезапно (аналогично ‘SIGKILL’ ). Видеть Сигнальные события Больше подробностей.
В Linux дочерние процессы дочерних процессов не будут завершены при попытке убить их родительский процесс. Это может произойти при запуске нового процесса в оболочке или с использованием shell вариант ChildProcess :
subprocess.killed ¶
Установить на true после subprocess.kill() используется для успешной отправки сигнала дочернему процессу.
В subprocess.killed указывает, успешно ли дочерний процесс получил сигнал от subprocess.kill() . В killed не указывает на то, что дочерний процесс был завершен.
subprocess.pid ¶
Возвращает идентификатор процесса (PID) дочернего процесса. Если дочерний процесс не запускается из-за ошибок, то значение равно undefined а также error испускается.
subprocess.ref() ¶
Вызов subprocess.ref() после звонка в subprocess.unref() восстановит удаленный счетчик ссылок для дочернего процесса, заставляя родительский процесс ждать завершения дочернего процесса, прежде чем выйти из себя.
subprocess.send(message[, sendHandle[, options]][, callback]) ¶
- message
- sendHandle
- options
- keepOpen
Значение, которое можно использовать при передаче экземпляров net.Socket . Когда true , сокет остается открытым в процессе отправки. Дефолт: false . - callback
- Возвращает:
Когда канал IPC был установлен между родительским и дочерним (т. Е. При использовании child_process.fork() ), subprocess.send() может использоваться для отправки сообщений дочернему процессу. Когда дочерний процесс является экземпляром Node.js, эти сообщения могут быть получены через ‘message’ событие.
Сообщение проходит сериализацию и синтаксический анализ. Полученное сообщение может отличаться от исходного.
Например, в родительском скрипте:
А потом дочерний сценарий, ‘sub.js’ может выглядеть так:
Дочерние процессы Node.js будут иметь process.send() собственный метод, который позволяет ребенку отправлять сообщения обратно родителю.
Особый случай при отправке
Необязательный sendHandle аргумент, который может быть передан subprocess.send() предназначен для передачи объекта TCP-сервера или сокета дочернему процессу. Потомок получит объект в качестве второго аргумента, переданного функции обратного вызова, зарегистрированной на ‘message’ событие. Любые данные, полученные и буферизованные в сокете, не будут отправлены потомку.
Необязательный callback — это функция, которая вызывается после отправки сообщения, но до того, как дочерний элемент может его получить. Функция вызывается с одним аргументом: null при успехе или Error объект при отказе.
Если нет callback предусмотрена функция, и сообщение не может быть отправлено, ‘error’ событие будет отправлено ChildProcess объект. Это может произойти, например, когда дочерний процесс уже завершился.
subprocess.send() вернусь false если канал закрыт или когда количество неотправленных сообщений превышает пороговое значение, что делает неразумным отправлять больше. В противном случае метод возвращает true . В callback функция может использоваться для реализации управления потоком.
Пример: отправка серверного объекта¶
В sendHandle аргумент может использоваться, например, для передачи дескриптора объекта TCP-сервера дочернему процессу, как показано в примере ниже:
Затем ребенок получит объект сервера как:
Как только сервер теперь используется совместно родителем и потомком, некоторые соединения могут обрабатываться родителем, а другие — дочерним.
Хотя в приведенном выше примере используется сервер, созданный с использованием net модуль dgram серверы модулей используют точно такой же рабочий процесс, за исключением прослушивания ‘message’ событие вместо ‘connection’ и используя server.bind() вместо того server.listen() . Однако в настоящее время это поддерживается только на платформах Unix.
Пример: отправка объекта сокета¶
Аналогичным образом sendHandler аргумент может использоваться для передачи дескриптора сокета дочернему процессу. В приведенном ниже примере создаются два дочерних элемента, каждый из которых обрабатывает соединения с «обычным» или «специальным» приоритетом:
В subprocess.js получит дескриптор сокета в качестве второго аргумента, переданного функции обратного вызова события:
Не используйте .maxConnections на сокете, который был передан подпроцессу. Родитель не может отслеживать, когда сокет уничтожен.
Любой ‘message’ обработчики в подпроцессе должны убедиться, что socket существует, поскольку соединение могло быть закрыто в течение времени, необходимого для отправки соединения дочернему элементу.
subprocess.signalCode ¶
В subprocess.signalCode указывает на сигнал, полученный дочерним процессом, если таковой имеется, иначе null .
subprocess.spawnargs ¶
В subprocess.spawnargs Свойство представляет полный список аргументов командной строки, с которыми был запущен дочерний процесс.
subprocess.spawnfile ¶
В subprocess.spawnfile указывает имя исполняемого файла запущенного дочернего процесса.
Для child_process.fork() , его значение будет равно process.execPath . Для child_process.spawn() , его значением будет имя исполняемого файла. Для child_process.exec() , его значением будет имя оболочки, в которой запущен дочерний процесс.
subprocess.stderr ¶
А Readable Stream который представляет дочерний процесс stderr .
Если ребенок был порожден с stdio[2] установить на что угодно, кроме ‘pipe’ , то это будет null .
subprocess.stderr это псевдоним для subprocess.stdio[2] . Оба свойства будут относиться к одному и тому же значению.
В subprocess.stderr собственность может быть null если не удалось создать дочерний процесс.
subprocess.stdin ¶
А Writable Stream который представляет дочерний процесс stdin .
Если дочерний процесс ожидает чтения всего своего ввода, дочерний процесс не продолжит работу, пока этот поток не будет закрыт через end() .
Если ребенок был порожден с stdio[0] установить на что угодно, кроме ‘pipe’ , то это будет null .
subprocess.stdin это псевдоним для subprocess.stdio[0] . Оба свойства будут относиться к одному и тому же значению.
В subprocess.stdin собственность может быть undefined если не удалось создать дочерний процесс.
subprocess.stdio ¶
Редкий массив каналов дочернего процесса, соответствующих позициям в stdio опция передана child_process.spawn() которые были установлены на значение ‘pipe’ . subprocess.stdio[0] , subprocess.stdio[1] , а также subprocess.stdio[2] также доступны как subprocess.stdin , subprocess.stdout , а также subprocess.stderr , соответственно.
В следующем примере только дочерний fd 1 (stdout) настроен как канал, поэтому только родительский subprocess.stdio[1] является потоком, все остальные значения в массиве равны null .
В subprocess.stdio собственность может быть undefined если не удалось создать дочерний процесс.
subprocess.stdout ¶
А Readable Stream который представляет дочерний процесс stdout .
Если ребенок был порожден с stdio[1] установить на что угодно, кроме ‘pipe’ , то это будет null .
subprocess.stdout это псевдоним для subprocess.stdio[1] . Оба свойства будут относиться к одному и тому же значению.
В subprocess.stdout собственность может быть null если не удалось создать дочерний процесс.
subprocess.unref() ¶
По умолчанию родитель будет ждать выхода отсоединенного дочернего элемента. Чтобы родители не ждали заданного subprocess для выхода используйте subprocess.unref() метод. Это приведет к тому, что родительский цикл событий не включит дочерний элемент в свой счетчик ссылок, что позволит родителю выйти независимо от дочернего элемента, если между дочерним и родительским элементом не будет установлен канал IPC.
maxBuffer и Юникод¶
В maxBuffer опция определяет максимальное количество байтов, разрешенное на stdout или stderr . Если это значение превышено, дочерний процесс завершается. Это влияет на вывод, который включает многобайтовые кодировки символов, такие как UTF-8 или UTF-16. Например, console.log(‘中文测试’) отправит 13 байтов в кодировке UTF-8 в stdout хотя там всего 4 символа.
Требования к оболочке¶
Оболочка должна понимать -c выключатель. Если оболочка ‘cmd.exe’ , он должен понимать /d /s /c переключатели и синтаксический анализ командной строки должны быть совместимы.
Оболочка Windows по умолчанию¶
Хотя Microsoft указывает %COMSPEC% должен содержать путь к ‘cmd.exe’ в корневой среде дочерние процессы не всегда подчиняются одному и тому же требованию. Таким образом, в child_process функции, в которых можно создать оболочку, ‘cmd.exe’ используется как запасной вариант, если process.env.ComSpec недоступен.
Расширенная сериализация¶
Дочерние процессы поддерживают механизм сериализации для IPC, основанный на API сериализации v8 модуль, на основе Структурированный алгоритм клонирования HTML. Это, как правило, более мощный и поддерживает больше встроенных типов объектов JavaScript, таких как BigInt , Map а также Set , ArrayBuffer а также TypedArray , Buffer , Error , RegExp и т.п.
Источник