child_process.spawn(command[, args][, options])
-
command
<String> The command to run -
args
<Array> List of string arguments -
options
<Object>-
cwd
<String> Current working directory of the child process -
env
<Object> Environment key-value pairs -
stdio
<Array> | <String> Child's stdio configuration. (Seeoptions.stdio
) -
detached
<Boolean> Prepare child to run independently of its parent process. Specific behavior depends on the platform, seeoptions.detached
) -
uid
<Number> Sets the user identity of the process. (See setuid(2).) -
gid
<Number> Sets the group identity of the process. (See setgid(2).) -
shell
<Boolean> | <String> Iftrue
, runscommand
inside of a shell. Uses '/bin/sh' on UNIX, and 'cmd.exe' on Windows. A different shell can be specified as a string. The shell should understand the-c
switch on UNIX, or/s /c
on Windows. Defaults tofalse
(no shell).
-
- return: <ChildProcess>
The child_process.spawn()
method spawns a new process using the given command
, with command line arguments in args
. If omitted, args
defaults to an empty array.
A third argument may be used to specify additional options, with these defaults:
{ cwd: undefined, env: process.env }
Use cwd
to specify the working directory from which the process is spawned. If not given, the default is to inherit the current working directory.
Use env
to specify environment variables that will be visible to the new process, the default is process.env
.
Example of running ls -lh /usr
, capturing stdout
, stderr
, and the exit code:
const spawn = require('child_process').spawn; const ls = spawn('ls', ['-lh', '/usr']); ls.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); ls.stderr.on('data', (data) => { console.log(`stderr: ${data}`); }); ls.on('close', (code) => { console.log(`child process exited with code ${code}`); });
Example: A very elaborate way to run 'ps ax | grep ssh'
const spawn = require('child_process').spawn; const ps = spawn('ps', ['ax']); const grep = spawn('grep', ['ssh']); ps.stdout.on('data', (data) => { grep.stdin.write(data); }); ps.stderr.on('data', (data) => { console.log(`ps stderr: ${data}`); }); ps.on('close', (code) => { if (code !== 0) { console.log(`ps process exited with code ${code}`); } grep.stdin.end(); }); grep.stdout.on('data', (data) => { console.log(`${data}`); }); grep.stderr.on('data', (data) => { console.log(`grep stderr: ${data}`); }); grep.on('close', (code) => { if (code !== 0) { console.log(`grep process exited with code ${code}`); } });
Example of checking for failed exec:
const spawn = require('child_process').spawn; const child = spawn('bad_command'); child.on('error', (err) => { console.log('Failed to start child process.'); });
options.detached
On Windows, setting options.detached
to true
makes it possible for the child process to continue running after the parent exits. The child will have its own console window. Once enabled for a child process, it cannot be disabled.
On non-Windows platforms, if options.detached
is set to true
, the child process will be made the leader of a new process group and session. Note that child processes may continue running after the parent exits regardless of whether they are detached or not. See setsid(2)
for more information.
By default, the parent will wait for the detached child to exit. To prevent the parent from waiting for a given child
, use the child.unref()
method. Doing so will cause the parent's event loop to not include the child in its reference count, allowing the parent to exit independently of the child, unless there is an established IPC channel between the child and parent.
When using the detached
option to start a long-running process, the process will not stay running in the background after the parent exits unless it is provided with a stdio
configuration that is not connected to the parent. If the parent's stdio
is inherited, the child will remain attached to the controlling terminal.
Example of a long-running process, by detaching and also ignoring its parent stdio
file descriptors, in order to ignore the parent's termination:
const spawn = require('child_process').spawn; const child = spawn(process.argv[0], ['child_program.js'], { detached: true, stdio: ['ignore'] }); child.unref();
Alternatively one can redirect the child process' output into files:
const fs = require('fs'); const spawn = require('child_process').spawn; const out = fs.openSync('./out.log', 'a'); const err = fs.openSync('./out.log', 'a'); const child = spawn('prg', [], { detached: true, stdio: [ 'ignore', out, err ] }); child.unref();
options.stdio
The options.stdio
option is used to configure the pipes that are established between the parent and child process. By default, the child's stdin, stdout, and stderr are redirected to corresponding child.stdin
, child.stdout
, and child.stderr
streams on the ChildProcess
object. This is equivalent to setting the options.stdio
equal to ['pipe', 'pipe', 'pipe']
.
For convenience, options.stdio
may be one of the following strings:
-
'pipe'
- equivalent to['pipe', 'pipe', 'pipe']
(the default) -
'ignore'
- equivalent to['ignore', 'ignore', 'ignore']
-
'inherit'
- equivalent to[process.stdin, process.stdout, process.stderr]
or[0,1,2]
Otherwise, the value of option.stdio
is an array where each index corresponds to an fd in the child. The fds 0, 1, and 2 correspond to stdin, stdout, and stderr, respectively. Additional fds can be specified to create additional pipes between the parent and child. The value is one of the following:
-
'pipe'
- Create a pipe between the child process and the parent process. The parent end of the pipe is exposed to the parent as a property on thechild_process
object asChildProcess.stdio[fd]
. Pipes created for fds 0 - 2 are also available as ChildProcess.stdin, ChildProcess.stdout and ChildProcess.stderr, respectively. -
'ipc'
- Create an IPC channel for passing messages/file descriptors between parent and child. A ChildProcess may have at most one IPC stdio file descriptor. Setting this option enables the ChildProcess.send() method. If the child writes JSON messages to this file descriptor, theChildProcess.on('message')
event handler will be triggered in the parent. If the child is a Node.js process, the presence of an IPC channel will enableprocess.send()
,process.disconnect()
,process.on('disconnect')
, andprocess.on('message')
within the child. -
'ignore'
- Instructs Node.js to ignore the fd in the child. While Node.js will always open fds 0 - 2 for the processes it spawns, setting the fd to'ignore'
will cause Node.js to open/dev/null
and attach it to the child's fd. -
Stream
object - Share a readable or writable stream that refers to a tty, file, socket, or a pipe with the child process. The stream's underlying file descriptor is duplicated in the child process to the fd that corresponds to the index in thestdio
array. Note that the stream must have an underlying descriptor (file streams do not until the'open'
event has occurred). - Positive integer - The integer value is interpreted as a file descriptor that is is currently open in the parent process. It is shared with the child process, similar to how
Stream
objects can be shared. -
null
,undefined
- Use default value. For stdio fds 0, 1 and 2 (in other words, stdin, stdout, and stderr) a pipe is created. For fd 3 and up, the default is'ignore'
.
Example:
const spawn = require('child_process').spawn; // Child will use parent's stdios spawn('prg', [], { stdio: 'inherit' }); // Spawn child sharing only stderr spawn('prg', [], { stdio: ['pipe', 'pipe', process.stderr] }); // Open an extra fd=4, to interact with programs presenting a // startd-style interface. spawn('prg', [], { stdio: ['pipe', null, null, null, 'pipe'] });
It is worth noting that when an IPC channel is established between the parent and child processes, and the child is a Node.js process, the child is launched with the IPC channel unreferenced (using unref()
) until the child registers an event handler for the process.on('disconnected')
event. This allows the child to exit normally without the process being held open by the open IPC channel.
See also: child_process.exec()
and child_process.fork()
Please login to continue.