2013-02-21 5 views
7

Der folgende Code:Wie Kindprozesse auf child_process.spawn reinigen() in node.js

#!/usr/bin/env node 
"use strict"; 

var child_process = require('child_process'); 

var x = child_process.spawn('sleep', [100],); 

throw new Error("failure"); 

laicht ein Kind Prozess und beendet, ohne Verlassen des Kind-Prozess wartet.

Wie kann ich es abwarten? Ich möchte waitpid (2) aufrufen, aber child_process scheint keine waitpid (2) zu haben.

ZUSÄTZLICH:

Sorry, was ich wirklich will, ist das Kind Prozess zu töten, wenn die Eltern vorhanden ist, anstatt sie warten.

+0

, wenn Sie einen err werfen oder die Anwendung wird beendet, wenn der Fehler nicht erfasst wird. Sie möchten auf den untergeordneten Prozess warten und dann die Anwendung beenden? – pfried

+1

In der Tat möchte ich den Kindprozess beenden, wenn der Elternprozess beendet wird. –

Antwort

13
#!/usr/bin/env node 
"use strict"; 

var child_process = require('child_process'); 

var x = child_process.spawn('sleep', [10]); 

x.on('exit', function() { 
    throw (new Error("failure")); 
}); 

EDIT:

Sie für den Hauptprozess durch Zugabe eines Zuhörers zu dem Haupt process wie process.on('exit', function() { x.kill() })

Aber werfen einen Fehler wie dies ein Problem hören können, sollten Sie besser den Prozess in der Nähe process.exit()

#!/usr/bin/env node 
"use strict"; 

var child_process = require('child_process'); 

var x = child_process.spawn('sleep', [100]); 

process.on('exit', function() { 
    x.kill(); 
}); 

process.exit(1); 
+0

process.on ('exit') und process.on ('uncaughtException') können tun, was ich will. Vielen Dank! –

+3

Bitte markieren Sie die Antwort als akzeptiert, wenn es das Problem löst – pfried

+0

Sie müssen tatsächlich auf den Kindprozess warten, nachdem Sie es getötet haben, sonst wird der Kindprozess in einen Zombie-Prozess verwandeln. Wenn der Elternprozess beendet wird, erhält Pid 1 (Init) den Job, es zu bereinigen. Das funktioniert aber technisch, es ist besser, wenn die Eltern ihr eigenes Chaos vor dem Verlassen aufräumen. –

3
#!/usr/bin/env node 
"use strict"; 

var child_process = require('child_process'); 

var x = child_process.spawn('sleep', [10]); 

process.on('exit', function() { 
    if (x) { 
    x.kill(); 
    } 
}); 
+1

Ist 'if (x)' ein guter Test, wenn der Child-Prozess beendet wird, bevor 'x.kill()' aufgerufen wird und verhindert wird, dass versehentlich ein Prozess mit einer neu zugewiesenen PID beendet wird? – Sukima