【问题标题】:Node JS: Executing command lines and getting outputs asynchronouslyNode JS:执行命令行并异步获取输出
【发布时间】:2014-06-24 08:49:42
【问题描述】:

如何运行命令行并尽快获取输出以在某处显示它们。

例如,如果在 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,然后你可以点击流并监听数据和结束事件。
  • 谢谢你的回答,我对node不是很熟悉,刚开始接触它,所以一个小代码示例,会很有帮助的

标签: linux node.js asynchronous command-line output


【解决方案1】:

尝试使用 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);
});

在此处查看 spawn 的 Node.js 文档:https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

【讨论】:

  • 它如何处理错误,我在cmd.stdout.on('error',... 上添加了一个侦听器,我想对进程对象执行此操作,但process.on(... 不起作用。
  • 对于错误处理,您需要监听 stderr。我已将其添加到我的示例中。您无法添加侦听器来处理,您需要将其添加到 spawn。
  • 即便如此,我在执行 ping 命令以进行测试 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> Finished events.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) 时仍然收到 Unhandled 'error' Event
  • @Xsmael 您只需输入您的 args 作为列表,例如: var cmd = process.spawn('ping', ['1.1.1.1']) 您可以使用 shell 词法分析器 (像 library.io/npm/shlex )如果你不确定你的 args 会是什么样子(即,如果你正在编写一个包装器并且需要关注空格)为你做这个。还要注意安全问题在文档链接中。
猜你喜欢
  • 2019-11-29
  • 2015-07-24
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-29
  • 2013-01-01
  • 2021-03-27
相关资源
最近更新 更多