Exec:显示stdout“live”
我有这个简单的脚本:
var exec = require('child_process').exec; exec('coffee -cw my_file.coffee', function(error, stdout, stderr) { console.log(stdout); });
在那里我只是执行一个命令来编译一个咖啡脚本文件。 但stdout永远不会显示在控制台中,因为命令永远不会结束(因为咖啡的-w选项)。 如果我直接从控制台执行命令,我会得到像这样的消息:
18:05:59 - compiled my_file.coffee
我的问题是:是否有可能用node.js exec显示这些消息? 如果是的话如何? !
谢谢
不要使用exec
。 使用一个EventEmmiter
对象的spawn
。 然后你可以听stdout
/ stderr
事件( spawn.stdout.on('data',callback..)
)。
从NodeJS文档:
var spawn = require('child_process').spawn, ls = spawn('ls', ['-lh', '/usr']); ls.stdout.on('data', function (data) { console.log('stdout: ' + data.toString()); }); ls.stderr.on('data', function (data) { console.log('stderr: ' + data.toString()); }); ls.on('exit', function (code) { console.log('child process exited with code ' + code.toString()); });
exec
缓冲输出,并通常在命令执行完成后返回。
exec
还将返回一个EventPromitter的ChildProcess对象。
var exec = require('child_process').exec; var coffeeProcess = exec('coffee -cw my_file.coffee'); coffeeProcess.stdout.on('data', function(data) { console.log(data); });
或者将subprocess的stdout传递给主stdout。
coffeeProcess.stdout.pipe(process.stdout);
我只想补充一点,用console.log()
从产生的进程中输出缓冲区string的一个小问题是,它添加了换行符,它可以将生成的进程输出扩展到另外的行。 如果使用process.stdout.write()
而不是console.log()
process.stdout.write()
来输出stdout
或stderr
,那么您将从“原样”得到衍生进程的控制台输出。
我在这里看到了这个解决scheme: Node.js:打印到没有尾随换行符的控制台?
希望能帮助使用上述解决scheme的人(即使是来自文档的实时输出,这也是一个很棒的解决scheme)。
受到Nathanael Smith的回答和Eric Freese的评论的启发,它可能如此简单:
var exec = require('child_process').exec; exec('coffee -cw my_file.coffee').stdout.pipe(process.stdout);
已经有几个答案,但是他们没有提到使用spawn
和{ stdio: 'inherit' }
选项的最好的(也是最简单的)方法。 它似乎产生最准确的输出,例如,当显示来自git clone
的进度信息。
只需做到这一点:
var spawn = require('child_process').spawn; spawn('coffee', ['-cw', 'my_file.coffee'], { stdio: 'inherit' });
感谢@MorganTouvereyQuilling在此评论中指出了这一点 。
在回顾了所有其他的答案后,我结束了这个:
function oldSchoolMakeBuild(cb) { var makeProcess = exec('make -C ./oldSchoolMakeBuild', function (error, stdout, stderr) { stderr && console.error(stderr); cb(error); }); makeProcess.stdout.on('data', function(data) { process.stdout.write('oldSchoolMakeBuild: '+ data); }); }
有时候data
会是多行的,所以oldSchoolMakeBuild
头文件会出现多行。 但是这并没有让我感到困扰,所以没有改变。
我发现将自定义执行脚本添加到我的实用程序是很有帮助的。
utilities.js
const { exec } = require('child_process') module.exports.exec = (command) => { const process = exec(command) process.stdout.on('data', (data) => { console.log('stdout: ' + data.toString()) }) process.stderr.on('data', (data) => { console.log('stderr: ' + data.toString()) }) process.on('exit', (code) => { console.log('child process exited with code ' + code.toString()) }) }
app.js
const { exec } = require('./utilities.js) exec('coffee -cw my_file.coffee')