【发布时间】:2017-09-07 18:27:59
【问题描述】:
我需要运行一个子进程,然后它会在后台运行;同时,我想操纵它的输出(添加时间戳等)并将其重定向到特定文件。 目前我正在这样做:
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 );
}
});
问题:
- 我是流的新手。我做对了吗?如果不是,那么“正确”的做法是什么?
- 我注意到流的“数据”回调中的错误不会冒泡——甚至
UnexpectedErrors,因此try {} catch {}语句。这是正确的方法吗?
【问题讨论】:
标签: javascript node.js stream node-streams