代码之家  ›  专栏  ›  技术社区  ›  Dushyant Bangal

如何在nodejs exec[duplicate]中捕获journalctl-f

  •  0
  • Dushyant Bangal  · 技术社区  · 7 年前

    var exec = require('child_process').exec;
    
    exec('coffee -cw my_file.coffee', function(error, stdout, stderr) {
        console.log(stdout);
    });
    

    如果我直接从控制台执行命令,会得到如下消息:

    18:05:59 - compiled my_file.coffee
    

    谢谢

    0 回复  |  直到 13 年前
        1
  •  301
  •   Samuel Bolduc    9 年前

    不要使用 exec . 使用 spawn 哪一个是 EventEmmiter 对象然后你可以听 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());
    });
    

    缓冲输出,通常在命令执行完毕后返回。

        2
  •  221
  •   Nathanael Smith    7 年前

    exec 还将返回作为EventEmitter的ChildProcess对象。

    var exec = require('child_process').exec;
    var coffeeProcess = exec('coffee -cw my_file.coffee');
    
    coffeeProcess.stdout.on('data', function(data) {
        console.log(data); 
    });
    

    pipe

    coffeeProcess.stdout.pipe(process.stdout);
    

    或者使用spawn继承stdio

    spawn('coffee -cw my_file.coffee', { stdio: 'inherit' });
    
        3
  •  84
  •   Community Mohan Dere    9 年前

    已经有几个答案了,但是没有一个提到最好(也是最简单)的方法,那就是使用 spawn { stdio: 'inherit' } option . 它似乎可以产生最精确的输出,例如,当显示来自 git clone .

    只需这样做:

    var spawn = require('child_process').spawn;
    
    spawn('coffee', ['-cw', 'my_file.coffee'], { stdio: 'inherit' });
    

    感谢@MorganTouvereyQuilling在本文中指出了这一点 this comment

        4
  •  23
  •   Tyler Liu    10 年前

    受Nathanel Smith的回答和Eric Freese的评论的启发,它可以简单到:

    var exec = require('child_process').exec;
    exec('coffee -cw my_file.coffee').stdout.pipe(process.stdout);
    
        5
  •  21
  •   Community Mohan Dere    9 年前

    console.log() stdout stderr 具有 process.stdout.write() 而不是

    我在这里看到了解决方案: Node.js: printing to console without a trailing newline?

    希望这能帮助使用上述解决方案的人(这是一个很好的实时输出解决方案,即使它来自文档)。

        6
  •  17
  •   cygri    7 年前

    我发现将自定义exec脚本添加到我的实用程序中很有帮助。

    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')
    
        7
  •  5
  •   Tongfa    9 年前

    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

        8
  •  3
  •   Adeojo Emmanuel IMM    8 年前

    因此,您可以使用下面使用的child_process.spawn解决您的问题。

    var spawn = require('child_process').spawn,
    ls = spawn('coffee -cw my_file.coffee');
    
    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('code ' + code.toString());
    });
    
        9
  •  1
  •   Swaner    6 年前

    这里有一个用typescript编写的异步助手函数,它似乎为我做到了这一点。我想这对长寿命的进程不起作用,但对某些人来说还是很方便的?

    import * as child_process from "child_process";
    
    private async spawn(command: string, args: string[]): Promise<{code: number | null, result: string}> {
        return new Promise((resolve, reject) => {
            const spawn = child_process.spawn(command, args)
            let result: string
            spawn.stdout.on('data', (data: any) => {
                if (result) {
                    reject(Error('Helper function does not work for long lived proccess'))
                }
                result = data.toString()
            })
            spawn.stderr.on('data', (error: any) => {
                reject(Error(error.toString()))
            })
            spawn.on('exit', code => {
                resolve({code, result})
            })
        })
    }