- Assertion Testing
- Buffer
- C/C++ Addons
- Child Processes
- Cluster
- Command Line Options
- Console
- Crypto
- Debugger
- DNS
- Domain
- Errors
- Events
- File System
- Globals
- HTTP
- HTTPS
- Modules
- Net
- OS
- Path
- Process
- Punycode
- Query Strings
- Readline
- REPL
- Stream
- String Decoder
- Timers
- TLS/SSL
- TTY
- UDP/Datagram
- URL
- Utilities
- V8
- VM
- ZLIB
Node.js v6.10.3 Documentation
Table of Contents
- Child Process
- Asynchronous Process Creation
- Synchronous Process Creation
- Class: ChildProcess
maxBufferand Unicode
Child Process#
Stability: 2 - Stable
The child_process module provides the ability to spawn child processes in
a manner that is similar, but not identical, to popen(3). This capability
is primarily provided by the child_process.spawn() function:
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}`);
});
By default, pipes for stdin, stdout and stderr are established between
the parent Node.js process and the spawned child. It is possible to stream data
through these pipes in a non-blocking way. Note, however, that some programs
use line-buffered I/O internally. While that does not affect Node.js, it can
mean that data sent to the child process may not be immediately consumed.
The child_process.spawn() method spawns the child process asynchronously,
without blocking the Node.js event loop. The child_process.spawnSync()
function provides equivalent functionality in a synchronous manner that blocks
the event loop until the spawned process either exits or is terminated.
For convenience, the child_process module provides a handful of synchronous
and asynchronous alternatives to child_process.spawn() and
child_process.spawnSync(). Note that each of these alternatives are
implemented on top of child_process.spawn() or child_process.spawnSync().
child_process.exec(): spawns a shell and runs a command within that shell, passing thestdoutandstderrto a callback function when complete.child_process.execFile(): similar tochild_process.exec()except that it spawns the command directly without first spawning a shell.child_process.fork(): spawns a new Node.js process and invokes a specified module with an IPC communication channel established that allows sending messages between parent and child.child_process.execSync(): a synchronous version ofchild_process.exec()that will block the Node.js event loop.child_process.execFileSync(): a synchronous version ofchild_process.execFile()that will block the Node.js event loop.
For certain use cases, such as automating shell scripts, the synchronous counterparts may be more convenient. In many cases, however, the synchronous methods can have significant impact on performance due to stalling the event loop while spawned processes complete.
Asynchronous Process Creation#
The child_process.spawn(), child_process.fork(), child_process.exec(),
and child_process.execFile() methods all follow the idiomatic asynchronous
programming pattern typical of other Node.js APIs.
Each of the methods returns a ChildProcess instance. These objects
implement the Node.js EventEmitter API, allowing the parent process to
register listener functions that are called when certain events occur during
the life cycle of the child process.
The child_process.exec() and child_process.execFile() methods additionally
allow for an optional callback function to be specified that is invoked
when the child process terminates.
Spawning .bat and .cmd files on Windows#
The importance of the distinction between child_process.exec() and
child_process.execFile() can vary based on platform. On Unix-type operating
systems (Unix, Linux, OSX) child_process.execFile() can be more efficient
because it does not spawn a shell. On Windows, however, .bat and .cmd
files are not executable on their own without a terminal, and therefore cannot
be launched using child_process.execFile(). When running on Windows, .bat
and .cmd files can be invoked using child_process.spawn() with the shell
option set, with child_process.exec(), or by spawning cmd.exe and passing
the .bat or .cmd file as an argument (which is what the shell option and
child_process.exec() do). In any case, if the script filename contains
spaces it needs to be quoted.
// On Windows Only ...
const spawn = require('child_process').spawn;
const bat = spawn('cmd.exe', ['/c', 'my.bat']);
bat.stdout.on('data', (data) => {
console.log(data.toString());
});
bat.stderr.on('data', (data) => {
console.log(data.toString());
});
bat.on('exit', (code) => {
console.log(`Child exited with code ${code}`);
});
// OR...
const exec = require('child_process').exec;
exec('my.bat', (err, stdout, stderr) => {
if (err) {
console.error(err);
return;
}
console.log(stdout);
});
// Script with spaces in the filename:
const bat = spawn('"my script.cmd"', ['a', 'b'], { shell: true });
// or:
exec('"my script.cmd" a b', (err, stdout, stderr) => {
// ...
});
child_process.exec(command[, options][, callback])#
command<String> The command to run, with space-separated argumentsoptions<Object>cwd<String> Current working directory of the child processenv<Object> Environment key-value pairsencoding<String> (Default:'utf8')shell<String> Shell to execute the command with (Default:'/bin/sh'on UNIX,'cmd.exe'on Windows, The shell should understand the-cswitch on UNIX or/s /con Windows. On Windows, command line parsing should be compatible withcmd.exe.)timeout<Number> (Default:0)maxBuffer<Number> largest amount of data (in bytes) allowed on stdout or stderr - if exceeded child process is killed (Default:200*1024)killSignal<String> | <Integer> (Default:'SIGTERM')uid<Number> Sets the user identity of the process. (See setuid(2).)gid<Number> Sets the group identity of the process. (See setgid(2).)
callback<Function> called with the output when process terminates- Returns: <ChildProcess>
Spawns a shell then executes the command within that shell, buffering any
generated output.
Note: Never pass unsanitised user input to this function. Any input containing shell metacharacters may be used to trigger arbitrary command execution.
const exec = require('child_process').exec;
exec('cat *.js bad_file | wc -l', (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
});
If a callback function is provided, it is called with the arguments
(error, stdout, stderr). On success, error will be null. On error,
error will be an instance of Error. The error.code property will be
the exit code of the child process while error.signal will be set to the
signal that terminated the process. Any exit code other than 0 is considered
to be an error.
The stdout and stderr arguments passed to the callback will contain the
stdout and stderr output of the child process. By default, Node.js will decode
the output as UTF-8 and pass strings to the callback. The encoding option
can be used to specify the character encoding used to decode the stdout and
stderr output. If encoding is 'buffer', or an unrecognized character
encoding, Buffer objects will be passed to the callback instead.
The options argument may be passed as the second argument to customize how
the process is spawned. The default options are:
{
encoding: 'utf8',
timeout: 0,
maxBuffer: 200*1024,
killSignal: 'SIGTERM',
cwd: null,
env: null
}
If timeout is greater than 0, the parent will send the signal
identified by the killSignal property (the default is 'SIGTERM') if the
child runs longer than timeout milliseconds.
Note: Unlike the exec(3) POSIX system call, child_process.exec() does not
replace the existing process and uses a shell to execute the command.
child_process.execFile(file[, args][, options][, callback])#
file<String> The name or path of the executable file to runargs<Array> List of string argumentsoptions<Object>cwd<String> Current working directory of the child processenv<Object> Environment key-value pairsencoding<String> (Default:'utf8')timeout<Number> (Default:0)maxBuffer<Number> largest amount of data (in bytes) allowed on stdout or stderr - if exceeded child process is killed (Default:200*1024)killSignal<String> | <Integer> (Default:'SIGTERM')uid<Number> Sets the user identity of the process. (See setuid(2).)gid<Number> Sets the group identity of the process. (See setgid(2).)
callback<Function> called with the output when process terminates- Returns: <ChildProcess>
The child_process.execFile() function is similar to child_process.exec()
except that it does not spawn a shell. Rather, the specified executable file
is spawned directly as a new process making it slightly more efficient than
child_process.exec().
The same options as child_process.exec() are supported. Since a shell is not
spawned, behaviors such as I/O redirection and file globbing are not supported.
const execFile = require('child_process').execFile;
const child = execFile('node', ['--version'], (error, stdout, stderr) => {
if (error) {
throw error;
}
console.log(stdout);
});
The stdout and stderr arguments passed to the callback will contain the
stdout and stderr output of the child process. By default, Node.js will decode
the output as UTF-8 and pass strings to the callback. The encoding option
can be used to specify the character encoding used to decode the stdout and
stderr output. If encoding is 'buffer', or an unrecognized character
encoding, Buffer objects will be passed to the callback instead.
child_process.fork(modulePath[, args][, options])#
modulePath<String> The module to run in the childargs<Array> List of string argumentsoptions<Object>cwd<String> Current working directory of the child processenv<Object> Environment key-value pairsexecPath<String> Executable used to create the child processexecArgv<Array> List of string arguments passed to the executable (Default:process.execArgv)silent<Boolean> Iftrue, stdin, stdout, and stderr of the child will be piped to the parent, otherwise they will be inherited from the parent, see the'pipe'and'inherit'options forchild_process.spawn()'sstdiofor more details (Default:false)stdio<Array> Supports the array version ofchild_process.spawn()'sstdiooption. When this option is provided, it overridessilent. The array must contain exactly one item with value'ipc'or an error will be thrown. For instance[0, 1, 2, 'ipc'].uid<Number> Sets the user identity of the process. (See setuid(2).)gid<Number> Sets the group identity of the process. (See setgid(2).)
- Returns: <ChildProcess>
The child_process.fork() method is a special case of
child_process.spawn() used specifically to spawn new Node.js processes.
Like child_process.spawn(), a ChildProcess object is returned. The returned
ChildProcess will have an additional communication channel built-in that
allows messages to be passed back and forth between the parent and child. See
child.send() for details.
It is important to keep in mind that spawned Node.js child processes are independent of the parent with exception of the IPC communication channel that is established between the two. Each process has its own memory, with their own V8 instances. Because of the additional resource allocations required, spawning a large number of child Node.js processes is not recommended.
By default, child_process.fork() will spawn new Node.js instances using the
process.execPath of the parent process. The execPath property in the
options object allows for an alternative execution path to be used.
Node.js processes launched with a custom execPath will communicate with the
parent process using the file descriptor (fd) identified using the
environment variable NODE_CHANNEL_FD on the child process. The input and
output on this fd is expected to be line delimited JSON objects.
Note: Unlike the fork(2) POSIX system call, child_process.fork() does
not clone the current process.
child_process.spawn(command[, args][, options])#
command<String> The command to runargs<Array> List of string argumentsoptions<Object>cwd<String> Current working directory of the child processenv<Object> Environment key-value pairsargv0<String> Explicitly set the value ofargv[0]sent to the child process. This will be set tocommandif not specified.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, runscommandinside 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-cswitch on UNIX, or/s /con Windows. Defaults tofalse(no shell).
- Returns: <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.
Note: If the shell option is enabled, do not pass unsanitised user input to
this function. Any input containing shell metacharacters may be used to
trigger arbitrary command execution.
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.toString());
});
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.');
});
Note: Certain platforms (OS X, Linux) will use the value of argv[0] for the
process title while others (Windows, SunOS) will use command.
Note: Node.js currently overwrites argv[0] with process.execPath on
startup, so process.argv[0] in a Node.js child process will not match the
argv0 parameter passed to spawn from the parent, retrieve it with the
process.argv0 property instead.
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 options.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_processobject aschild.stdio[fd]. Pipes created for fds 0 - 2 are also available aschild.stdin,child.stdoutandchild.stderr, respectively.'ipc'- Create an IPC channel for passing messages/file descriptors between parent and child. AChildProcessmay have at most one IPC stdio file descriptor. Setting this option enables thechild.send()method. If the child writes JSON messages to this file descriptor, thechild.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/nulland 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 the
stdioarray. 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('disconnect') event
or the process.on('message') 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()
Synchronous Process Creation#
The child_process.spawnSync(), child_process.execSync(), and
child_process.execFileSync() methods are synchronous and WILL block
the Node.js event loop, pausing execution of any additional code until the
spawned process exits.
Blocking calls like these are mostly useful for simplifying general purpose scripting tasks and for simplifying the loading/processing of application configuration at startup.
child_process.execFileSync(file[, args][, options])#
file<String> The name or path of the executable file to runargs<Array> List of string argumentsoptions<Object>cwd<String> Current working directory of the child processinput<String> | <Buffer> The value which will be passed as stdin to the spawned process- supplying this value will override
stdio[0]
- supplying this value will override
stdio<String> | <Array> Child's stdio configuration. (Default:'pipe')stderrby default will be output to the parent process' stderr unlessstdiois specified
env<Object> Environment key-value pairsuid<Number> Sets the user identity of the process. (See setuid(2).)gid<Number> Sets the group identity of the process. (See setgid(2).)timeout<Number> In milliseconds the maximum amount of time the process is allowed to run. (Default:undefined)killSignal<String> | <Integer> The signal value to be used when the spawned process will be killed. (Default:'SIGTERM')maxBuffer<Number> largest amount of data (in bytes) allowed on stdout or stderr - if exceeded child process is killedencoding<String> The encoding used for all stdio inputs and outputs. (Default:'buffer')
- Returns: <Buffer> | <String> The stdout from the command
The child_process.execFileSync() method is generally identical to