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
:
Dies ist mein Knotenserver namens index.js
(Ich habe keine process
-Ereignislistener erstellt):
Und das Startskript wird mit dem Knoten child_process
modul:
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)
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)
haben einen Handler für Prozesssignale in Ihrem Server
und dann eine "shutdown.sh".
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%Tags und Links bash node.js process child-process sigkill