Durch das Töten eines Bash-Skripts werden untergeordnete Prozesse nicht gelöscht

8

Ich habe ein Testskript geschrieben, das ein anderes Skript ausführt, um den Server zum Testen zu starten. Wenn die Tests abgeschlossen sind, wird eine SIGKILL -Nachricht an den Serverprozess gesendet. Wenn das Testskript jedoch erneut ausgeführt wird, löst der Server einen EADDRINUSE -Fehler aus (ich bin in einer node.js-Umgebung), was den Port des Servers bedeutet zu versuchen, zu mounten, wird derzeit verwendet. Der Prozess, den wir mit SIGKILL beenden wollten, läuft noch. Ich glaube nicht, dass dies ein knotenspezifisches Problem ist, sondern eher ein Mangel an Bildung an meinem Ende, wie bash Prozesse funktionieren.

Hier sind einige Besonderheiten, das ist mein Startskript namens scripts/start-node.sh :

%Vor%

Dies ist mein Knotenserver namens index.js (Ich habe keine process -Ereignislistener erstellt):

%Vor%

Und das Startskript wird mit dem Knoten child_process modul:

gesteuert %Vor%     
Calebmer 25.10.2015, 01:45
quelle

3 Antworten

9

Um einen untergeordneten Prozess und alle seine untergeordneten Elemente zu beenden, können Sie process.kill mit einem negativen pid verwenden. (um eine Prozessgruppe zu töten)

%Vor%

Einzelheiten zu child_process documentation für options.detached

  

Wenn die separate Option aktiviert ist, wird der untergeordnete Prozess bei Nicht-Windows zum Vorspann einer neuen Prozessgruppe und Sitzung.

Hier wird ein Teil von man 2 kill für einige Details referenziert:

  

Wenn pid kleiner als -1 ist, wird sig an jeden Prozess in der Prozessgruppe gesendet, deren ID -pid ist.

Eine weitere Option ist die Verwendung von trap in Ihrem Shell-Skript, um ein Signal abzufangen und alle Kinder zu töten und child.kill('SIGTERM') von node zu verwenden (da SIGKILL nicht von trap abgefangen wird)

%Vor%     
Juicy Scripter 27.10.2015, 12:12
quelle
0

haben einen Handler für Prozesssignale in Ihrem Server

server.js

%Vor%

startup.sh

%Vor%

und dann eine "shutdown.sh".

shutdown.sh

%Vor%

Es werden alle Prozesse mit diesem Namen beendet, falls Sie in Ihrer "start-node.sh" mehrere Prozesse erzeugen. Auf diese Weise können Sie beim Herunterfahren z. Schließen aller Verbindungen usw.

und in deinem Test Runner kannst du

machen %Vor%     
Holger Will 27.10.2015 12:09
quelle
-1

Haben Sie ein exit 0 in Ihrem Skript?

Beispiel:

%Vor%     
Jet 30.10.2015 08:48
quelle