2017-04-12 5 views
0

子プロセスを実行して、バックグラウンドで実行する必要があります。同時に、出力(タイムスタンプなどの追加)を操作して特定のファイルにリダイレクトしたいと思っています。プロセスを実行し、stdin/stroutを特定のファイルにリダイレクトします。

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 {}ステートメントがあります。それが正しい方法でしたか?

答えて

関連する問題