龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

Node.js中创建和管理外部进程详解_node.js(5)

时间:2014-08-25 12:00来源:网络整理 作者:网络 点击:
分享到:
复制代码 代码如下: var spawn = require('child_process').spawn; // 生成子进程来执行 "ls -la"命令 var child = spawn('ls', ['-la']); child.stdout.on('data', function(data) { console.log

复制代码 代码如下:

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');

精彩图集

赞助商链接