Node JS:异步执行命令行并获取输出

3
如何在命令行运行并尽快获取输出以显示到其他地方?
例如,在Linux系统上运行ping命令,它将永远不会停止,那么是否可能在命令仍在处理时获取响应呢? 或者我们来看一下apt-get install命令,如果我想在安装过程中显示进度怎么办?
实际上,我正在使用此函数来执行命令行并获取输出,但该函数直到命令行结束才会返回,因此如果我运行ping命令,它将永远不会返回!
var sys     = require('sys'),
    exec    = require('child_process').exec;

function getOutput(command,callback){
    exec(
        command, 
        (
            function(){
                return function(err,data,stderr){
                    callback(data);
                }
            }
        )(callback)
    );
}

尝试使用 spawn 而不是 exec,这样您就可以连接到流并监听数据和结束事件。 - Ben Fortune
谢谢您的回答,我对Node不是很熟悉,刚开始接触它,所以一个小的代码示例会非常有帮助。 - Xsmael
1个回答

6

尝试使用spawn而不是exec,这样您就可以访问流并监听数据和结束事件。

var process = require('child_process');

var cmd = process.spawn(command);

cmd.stdout.on('data', function(output){
    console.log(output.toString()):
});

cmd.on('close', function(){
    console.log('Finished');
});

//Error handling
cmd.stderr.on('data', function(err){
    console.log(err);
});

请参考Node.js文档中spawn的相关内容:https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

它如何处理错误,我在 cmd.stdout.on('error',... 上添加了一个监听器,我想用 process 对象做同样的事情,但是 process.on(... 不起作用。 - Xsmael
为了错误处理,你需要监听stderr。我已经将其添加到我的示例中。你不能添加一个监听器到进程,你需要将其添加到spawn。 - Ben Fortune
1
即使如此,我仍然在执行ping命令进行测试时遇到了“Unhandled 'error' Event”问题。`node server.js <Buffer 65 78 65 63 76 70 28 29 3a 20 4e 6f 20 73 75 63 68 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63 74 6f 72 79 0a> Finishedevents.js:72 throw er; // Unhandled 'error' event ^ Error: spawn ENOENT at errnoException (child_process.js:988:11) at Process.ChildProcess._handle.onexit (child_process.js:779:34)` - Xsmael
@Xsmael,你只需要将参数作为列表输入,例如:var cmd = process.spawn('ping',['1.1.1.1'])。如果你不确定参数的样子(比如说,如果你正在编写一个包装器并且需要关注空格),可以使用 shell lexer (如 libraries.io/npm/shlex)来帮你完成这个任务。还要注意文档链接中的安全问题。 - fatal_error

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接