2017-04-12 8 views
0

Ich muss einen Kindprozess ausführen, der dann im Hintergrund ausgeführt wird; Gleichzeitig möchte ich die Ausgabe manipulieren (Zeitstempel hinzufügen usw.) und sie an bestimmte Dateien weiterleiten. Im Moment habe ich dies tue:Einen Prozess ausführen und Stdin/Strout zu bestimmten Dateien umleiten

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); 
    } 
}); 

Fragen:

  • Ich bin neu in Strömen. Mache ich das richtig? Wenn nicht, was ist der "richtige" Weg, dies zu tun?
  • Ich bemerkte, dass Fehler innerhalb der "Daten" Callbacks des Streams nicht aufblasen - nicht einmal UnexpectedError s, daher die try {} catch {} Aussagen. War das der richtige Weg?

Antwort

Verwandte Themen