Wie töte ich einen Kinderprozess in NodeJS?

72

Erstellt einen untergeordneten Prozess mit shelljs

!/usr/bin/env node

require('/usr/local/lib/node_modules/shelljs/global');
   fs = require("fs");  
   var child=exec("sudo mongod &",{async:true,silent:true});

   function on_exit(){
        console.log('Process Exit');
        child.kill("SIGINT");
        process.exit(0)
    }

    process.on('SIGINT',on_exit);
    process.on('exit',on_exit);

Der untergeordnete Prozess wird noch ausgeführt. Nach dem Beenden des übergeordneten Prozesses

Deepak Patil
quelle
6
Sie führen aus, mongod &was den Prozess abspaltet und an den Hintergrund sendet. Das Senden von SIGINT beendet den eigentlichen mongodProzess nicht.
Fardjad
1
Eine weitere Sache, anstatt Ihr Skript auszuführen sudo mongod, ausführen mongodund ausführen mit sudo. Sie können Berechtigungen nach der Ausführung mongod(mit process.setuid()und process.setgid()) löschen, wenn Sie möchten.
Fardjad
'&' entfernt und es hat funktioniert .... danke stackoverflow.com/users/303270/fardjad
Deepak Patil
@fardjad, wie soll man damit umgehen? Wir alle wissen, was Sie gesagt haben. Es ist hier geschrieben, kein Geheimnis nodejs.org/api/… . Aber damit umgehen? Wissen Sie?
Grün
@ Green Vielleicht hilft das: npmjs.com/package/ps-tree
fardjad

Antworten:

81

Wenn Sie die integrierten Knoten verwenden können child_process.spawn, können Sie ein SIGINTSignal an den untergeordneten Prozess senden :

var proc = require('child_process').spawn('mongod');
proc.kill('SIGINT');

Ein Vorteil davon ist, dass der Hauptprozess so lange bestehen bleiben sollte, bis alle untergeordneten Prozesse beendet sind.

Michael Tang
quelle
3
ist proc.kill () nicht genug? oder brauchen wir proc.kill ('SIGINT')?
Alexander Mills
Ich erinnere mich nicht an die Einzelheiten von mongod, aber das Senden proc.kill()ist (derzeit) gleichbedeutend mit dem Senden proc.kill('SIGTERM')(ich gehe davon aus, dass ich dachte, es SIGINTwürde heruntergefahren mongod?). Ich stelle mir vor, dass man das richtige Signal für die jeweilige Anwendung auswählen würde.
Michael Tang
30
Wie beantwortet dies die Frage? Diese Antwort legt genau das nahe, was der Autor der Frage bereits tut, um den Prozess abzubrechen. Trotzdem bekommt es so viele positive Stimmen?
Fischgräte
FALSCH! Sie können einen Dienst, den Sie in einem untergeordneten Prozess gestartet haben, nicht beenden. Sie können den untergeordneten Prozess beenden, aber einen Dienst nicht beenden. Das ist das Problem: "Das an den untergeordneten
Green
1
Danke, das hat mir Zeit gespart! Außerdem hatte ich das Problem, dass mein gegabelter Prozess andere Prozesse (mit Cluster) .kill('SIGINT')hervorbrachte und den Trick ausführte und alle untergeordneten und untergeordneten Prozesse in meiner Elektronenknoten-Anwendung
Kirill Gusyatin