Node.js中创建和管理外部进程详解_node.js(5)
var spawn = require('child_process').spawn;
// 生成子进程来执行 "ls -la"命令
var child = spawn('ls', ['-la']);
child.stdout.on('data', function(data) {
console.log('data from child: ' + data);
});
// 当子进程退出:
<strong>child.on('exit', function(code) {
console.log('child process terminated with code ' + code);
});</strong>
最后几行加黑的代码,父进程使用子进程的exit事件来监听它的退出事件,当事件发生时,控制台显示相应的输出。子进程的退出码会被作为第一个参数传递给回调函数。有些程序使用一个非0的退出码来代表某种失败状态。比如,如果你尝试执行命令“ls –al click filename.txt”,但是当前目录没有这个文件,你就会得到一个值为1的退出码,见例8-9:
例8-9:获得子进程的退出码 (chapter8/10_child_exit_code.js)
var spawn = require('child_process').spawn;
// 生成子进程,执行"ls does_not_exist.txt" 命令
var child = spawn('ls', ['does_not_exist.txt']);
// 当子进程退出
child.on('exit', function(code) {
console.log('child process terminated with code ' + code);
});
这个例子里,exit事件触发了回调函数,并把子进程的退出码作为第一个参数传递给它。如果子进程是被信号杀死而导致的非正常退出,那么相应的信号代码会被当作第二个参数传递给回调函数,如例8-10:
LISTING 8-10: 获得子进程的退出信号(chapter8/11_child_exit_signal.js)
var spawn = require('child_process').spawn;
// 生成子进程,运行"sleep 10"命令
var child = spawn('sleep', ['10']);
setTimeout(function() {
child.kill();
}, 1000);
child.on('exit', function(code, signal) {
if (code) {
console.log('child process terminated with code ' + code);
} else if (signal) {
console.log('child process terminated because of signal ' + signal);
}
});
这个例子里,启动一个子进程来执行sleep 10秒的操作,但是还没到10秒就发送了一个SIGKILL信号给子进程,这将会导致如下的输出:
child process terminated because of signal SIGTERM
发送信号并杀死进程
在这部分,你将学习如何使用信号来管理子进程。信号是父进程用来跟子进程通信,甚至杀死子进程的一种简单方式。
不同的信号代码代表不同的含义,有很多信号,其中最常见的一些是用来杀死进程的。如果一个进程接收到一个它不知道如何处理的信号,程序就会被异常中断。有些信号会被子进程处理,而有些只能由操作系统处理。
一般情况下,你可以使用child.kill方法来向子进程发送一个信号,默认发送SIGTERM信号:
var spawn = require('child_process').spawn;
var child = spawn('sleep', ['10']);
setTimeout(function() {
child.kill();
}, 1000);
还可以通过传入一个标识信号的字符串作为kill方法的唯一参数,来发送某个特定的信号:
child.kill(‘SIGUSR2');