运行进程并将stdin / strout重定向到特定文件

时间:2017-04-12 06:14:47

标签: javascript node.js stream node-streams

我需要运行一个子进程,然后在后台运行;同时,我想操纵它的输出(添加时间戳等)并将其重定向到特定文件。 目前我正在这样做:

try {
  var out = fs.createWriteStream(`${this.logdir}/${lp}-out.log`, { flags: 'a', defaultEncoding: 'utf8' } );
  var err = fs.createWriteStream(`${this.logdir}/${lp}-err.log`, { flags: 'a', defaultEncoding: 'utf8' } );
} catch( e ){
  console.log("Could not open log files for writing:", e );
  return;
}

try {
  var child = childProcess.spawn( '/usr/bin/node', [ server ], { env: env, uid: uid, gid: gid, cwd: cwd } );
} catch( e ) {
  console.log("Could not run node:", e );
  return;
}

child.stdout.on('data', function( data ){

  try { 
    // The child process has stopped dealing with incoming connections.
    // For all intents and purposes, the process is useless and dead
    var d = data.toString();
    if( data.toString().match( /^THE SERVER HAS STOPPED$/m ) ){
      console.log("The child process has stopped taking connections!");
      try { fs.unlinkSync( pidFile ); } catch( e ){}
      dead = true;

      maybeRestart();
    }
    var pre = (new Date()).toString() + ' [' + child.pid + '] ';
    out.write( Buffer.from( data.toString().trim().split("\n").map( (l,i) => { return pre + l }) .join('\n') + '\n' ));
  } catch( e ){
    console.log("Error while redirecting stream to standard output!", e );
  }
});
child.stderr.on('data', function( data ){
  try {
    var pre = (new Date()).toString() + ' [' + child.pid + '] ';
    err.write( Buffer.from( data.toString().trim().split("\n").map( (l,i) => { return pre + l }) .join('\n') + '\n' ));
  } catch( e ){
    console.log("Error while redirecting stream to standard error!", e );
  }
});

问题:

  • 我是溪流新手。我做得对吗?如果没有,那么"对"是什么?这样做的方式?
  • 我注意到流中的错误"数据"回调不会冒泡 - 甚至不是UnexpectedError,因此try {} catch {}语句。这是正确的方法吗?

1 个答案:

答案 0 :(得分:0)

我不确定你究竟需要什么。这取决于您的需求,如果spawnSync也是一个选项。如果您知道该过程不会花费很长时间并且您将直接返回stdout,那就容易多了:https://nodejs.org/api/child_process.html#child_process_child_process_spawnsync_command_args_options