Node.js产生subprocess并获得terminal输出

我有一个脚本输出“嗨”,睡一秒钟,输出“嗨”,睡1秒,等等等等。 现在我想我能用这个模型解决这个问题。

var spawn = require('child_process').spawn, temp = spawn('PATH TO SCRIPT WITH THE ABOVE BEHAVIOUR'); temp.stdout.pipe(process.stdout); 

现在问题是需要完成任务才能显示输出。 正如我所理解的,这是由于新产生的进程需要执行控制。 显然node.js不支持线程,所以任何解决scheme? 我的想法是可能运行两个实例,第一个为了创build任务的具体目的,并将其输出到第二个实例的进程,考虑到这可以实现。

我还在用Node.js弄湿我的脚,但我有一些想法。 首先,我相信你需要使用execFile而不是spawn ; execFile用于有脚本path,而spawn用于执行Node.js可以根据系统pathparsing的众所周知的命令。

1. 提供callback来处理缓冲输出:

 var child = require('child_process').execFile('path/to/script', [ 'arg1', 'arg2', 'arg3', ], function(err, stdout, stderr) { // Node.js will invoke this callback when the console.log(stdout); }); 

2.将侦听器添加到subprocess的stdout stream ( 9thport.net )

 var child = require('child_process').execFile('path/to/script', [ 'arg1', 'arg2', 'arg3' ]); // use event hooks to provide a callback to execute when data are available: child.stdout.on('data', function(data) { console.log(data.toString()); }); 

此外,似乎有选项,您可以从Node的控制terminal分离产生的进程,这将允许它asynchronous运行。 我还没有testing过,但API文档中有这样的例子:

 child = require('child_process').execFile('path/to/script', [ 'arg1', 'arg2', 'arg3', ], { // detachment and ignored stdin are the key here: detached: true, stdio: [ 'ignore', 1, 2 ] }); // and unref() somehow disentangles the child's event loop from the parent's: child.unref(); child.stdout.on('data', function(data) { console.log(data.toString()); }); 

现在更容易(2年后)!

Spawn返回一个childObject ,然后你可以监听事件 。 事件是:

  • 类:ChildProcess
    • 事件:“错误”
    • 事件:“退出”
    • 事件:'close'
    • 事件:“断开”
    • 事件:'消息'

还有一堆来自childObject对象 ,它们是:

  • 类:ChildProcess
    • child.stdin
    • child.stdout
    • child.stderr
    • child.stdio
    • child.pid
    • child.connected
    • child.kill([信号])
    • child.send(message [,sendHandle] [,callback])
    • child.disconnect()

在这里查看更多关于childObject的信息: https ://nodejs.org/api/child_process.html

所以,结合所有这一切,你会得到:

 var spawn = require('child_process').spawn; var child = spawn('node ./commands/server.js'); child.stdout.on('data', function(data) { console.log('stdout: ' + data); //Here is where the output goes }); child.stderr.on('data', function(data) { console.log('stderr: ' + data); //Here is where the error output goes }); child.on('close', function(code) { console.log('closing code: ' + code); //Here you can get the exit code of the script }); 

这就是你如何得到Node的输出!

当我在subprocess中生成npm时,从“npm install”命令获取日志输出时遇到了一些麻烦。 父控制台中不显示依赖项的实时日志logging。

做最初的海报需要的最简单的方法似乎是这样的(在Windows上产生npm并将所有内容logging到父级控制台):

 var args = ['install']; var options = { stdio: 'inherit' //feed all child process logging into parent process }; var childProcess = spawn('npm.cmd', args, options); childProcess.on('close', function(code) { process.stdout.write('"npm install" finished with code ' + code + '\n'); }); 

儿童:

 setInterval(function() { process.stdout.write("hi"); }, 1000); // or however else you want to run a timer 

父:

 require('child_process').fork('./childfile.js'); // fork'd children use the parent's stdio 

我发现自己经常需要这个function,所以我把它打包到一个名为std-pour的库中。 它应该让你执行一个命令并实时查看输出。 安装简单:

 npm install std-pour 

那么执行命令并实时查看输出就足够简单了:

 const { pour } = require('std-pour'); pour('ping', ['8.8.8.8', '-c', '4']).then(code => console.log(`Error Code: ${code}`)); 

它承诺的基础,所以你可以链接多个命令。 它甚至是与child_process.spawn函数签名兼容的,所以它应该是你使用它的任何地方的替代品。

这是我发现的最干净的方法:

 require("child_process").spawn('bash', ['./script.sh'], { cwd: process.cwd(), detached: true, stdio: "inherit" });