- 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.11.1 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, macOS) 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) => {
// ...
});