// 生成子进程,执行”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′);
需要注意的是,虽然这个方法的名字叫kill,但是发送的信号并不一定会杀死子进程。如果子进程处理了信号,默认的信号行为就会被覆盖。用Node写的子进程可以像下面这样重写信号处理器的定义:
process.on(‘SIGUSR2’, function() {
console.log(‘Got a SIGUSR2 signal’);









