node.js -- 同步执行命令并获取结果

Posted

技术标签:

【中文标题】node.js -- 同步执行命令并获取结果【英文标题】:node.js -- execute command synchronously and get result 【发布时间】:2011-11-03 05:47:54 【问题描述】:

我正在尝试在 node.js 中同步执行 child_process(是的,我知道这很糟糕,我有充分的理由)并在 stdout 上检索任何输出,但我不太清楚如何...

我发现了这个 SO 帖子:node.js execute system command synchronously,它描述了如何使用库 (node-ffi) 来执行命令,这很好用,但我唯一能得到的是进程退出代码。该命令执行的任何数据都直接发送到标准输出——我如何捕获它?

> run('whoami')
username
0

换句话说,username 被回显到标准输出,run 的结果是0

我会很多而不是弄清楚如何读取标准输出

【问题讨论】:

试着看看[这里][1]。这是对同一个问题的讨论。 [1]:***.com/questions/4443597/… 【参考方案1】:

所以我有一个可行的解决方案,但并不完全喜欢它......只是在这里发布以供参考:

我正在使用其他 SO 帖子中引用的 node-ffi 库。我有一个功能:

接受给定的命令 附加>> run-sync-output 执行它 同步读取run-sync-output并存储结果 删除此 tmp 文件 返回结果

有一个明显的问题,如果用户没有对当前目录的写入权限,它就会失败。另外,这只是浪费精力。 :-/

【讨论】:

【参考方案2】:

我已经构建了一个 node.js 模块来解决这个确切的问题。看看吧:)

exec-plan

更新

上面的模块解决了你原来的问题,因为它允许子进程的同步链接。链中的每个环节都从链中的前一个进程获取标准输出。

【讨论】:

该模块中的哪些方法可用于获取命令的输出? 该模块的目的是建立一个命令链作为计划,stdout/err 将可用于计划中“next”命令的“preLogic”功能。因此,例如:如果您有 execPlan.add('ps -ef');然后,在下一次“添加”时,您可以使用“预逻辑”函数作为第一个参数来使用“ps -ef”的输出。例如: execPlan.add(function (stdout) // 对在 'grep ls' 之前运行的 'ps -ef' 的标准输出做一些事情 , 'grep ls');。如果此评论没有很好地阐明,您可以在模块的 github 站点本身上发布吗?另外,检查 README.md :) 是否可以使用此模块将命令行输出作为字符串返回(而不仅仅是使用 console.log 打印它?) 另外,如果这个答案实际上解释了如何模块将解决问题,而不是简单地提供相关链接,那会更好。 我更新了答案。感谢您提供更好的说明的建议。【参考方案3】:

我遇到了类似的问题,我最终为此编写了一个节点扩展。您可以查看 git 存储库。它是开源和免费的,而且所有的好东西!

https://github.com/aponxi/npm-execxi

ExecXI 是一个用 C++ 编写的节点扩展,用于执行 shell 命令 一个一个,将命令的输出输出到控制台 即时的。存在可选的链式和非链式方式;意义 您可以选择在命令失败后停止脚本 (链式),或者您可以像什么都没发生一样继续!

使用说明在ReadMe file 中。随意提出拉取请求或提交问题!

但是它还没有返回标准输出......好吧,我今天刚刚发布了它。也许我们可以以此为基础。

无论如何,我认为值得一提。我也将这个发布到一个类似的问题:node.js execute system command synchronously

【讨论】:

【参考方案4】:

从 Node 版本 v0.11.12 开始,有一个 child_process.execSync 函数用于此。

【讨论】:

【参考方案5】:

除了编写代码有点不同之外,实际上没有理由做任何同步的事情。

你不喜欢这个? (docs)

var exec = require('child_process').exec;

exec('whoami', function (error, username) 
    console.log('stdout: %s', username);
    continueWithYourCode();
);

【讨论】:

其实有这种情况。我有一个链接到stylus 的库,它从单个图像编译 CSS 精灵。由于stylus 是同步写入的,因此任何挂钩也必须是同步的。我不打算重新编写整个解析引擎,即使我这样做了,它也可能不会被主分支接受,我的外部库只能在我的分支上工作。 -1 "没有理由..." 你怎么知道?我讨厌这些永远无法证明是正确的毫无意义的论点,事实上你是错的,在某些情况下,同步做事要么是必须的,要么是有帮助的。 @rFactor:实际上没有理由。您可以说正确同步代码更容易,因为您已经习惯了,但实际上没有理由。 @dresende 它与“轻松”无关。例如,我现在对此有一个问题。我正在尝试让 Dart frog 编译器与 Node 的 require() 一起使用。官方且唯一的方法是使用module.require.extensions['.dart'] = ...。编译工作,但是,require 是同步的,所以我的 Dart 编译器不能是异步的,编译器是第 3 方可执行文件,所以我可以执行它。看?除了同步执行之外,没有办法解决这个问题。 在编码之前试着把百叶窗从你的眼睛里拿出来,想想算法。如果你不能,那里有很多帮助者,比如github.com/creationix/step 和其他人......

以上是关于node.js -- 同步执行命令并获取结果的主要内容,如果未能解决你的问题,请参考以下文章

在 node.js 中导入 sql 文件并针对 PostgreSQL 执行

如何在Node.js中执行IO任务序列[重复]

node.js 中的同步 HTTP 请求

node.js,express - 在循环中以同步方式一个接一个地执行mysql查询

Nodejs异步编程

Nodejs异步编程