Anmutig Herunterfahren UNIX-socket-server, der auf NodeJS läuft unter Forever
Habe ich eine NodeJS Anwendung setzt ein UNIX-socket zu setzen einige interprocess communication channel (eine Art monitoring-Zeug). UNIX-socket-Datei in os.tmpdir()
Ordner (also /tmp/app-monitor.sock
).
var net = require('net');
var server = net.createServer(...);
server.listen('/tmp/app-monitor.sock', ...);
Benutze ich ein signal handling (SIGINT, SITERM, etc...) ordnungsgemäß Herunterfahren meines Servers, und entfernen Sie eine socket-Datei.
function shutdown() {
server.close(); //socket file is automatically removed here
process.exit();
}
process.on('SIGINT', shutdown);
//and so on
Meine Anwendung ausgeführt wird, mit forever start ...
überwachung des Lebenszyklus.
Ich habe ein problem mit forever restartall
Befehl. Wenn für immer tun restartall
es mit einem SIGKILL
beenden aller child-Prozesse. SIGKILL
können nicht behandelt werden, durch einen Prozess, so dass meine app stirbt ohne shutdown-Verfahren.
Das problem ist eine socket-Datei, die nicht entfernt werden, wenn SIGKILL
verwendet wird. Nach der Kind-Prozess wird neu gestartet, neue server kann nicht gestartet werden Ursache' eine listen
Anruf wird zu einer EADDRINUSE
Fehler.
Ich kann nicht entfernen Sie eine vorhandene socket-Datei bei einem app-Start führen: "ich weiß nicht, ob es eine wirklich funktionierende Steckdose oder einige Spuren von einer früheren unsauberen Herunterfahren.
So, die Frage ist... Was ist der bessere Weg, um mit solchen situation (SIGKILL-und UNIX-socket-server)?
- haben u Lesen Sie dieses nodejs.org/api/all.html#all_signal_events
- Ja, und hast du gelesen, meine Frage?
- Nein habe ich nicht gelesen. Es ist leicht zu sagen als zu tun. Wenn Sie nichts dagegen haben, ändern Sie den code in ewig, dann forever/node_modules/forever-monitor/lib/forever-monitor/monitor.js in fuunction Monitor.der Prototyp.töten fügen Sie die SIGINT, bevor Sie für immer senden das signal SIGKILL
- Dies ist eine schlechte Lösung. Ich will nicht zu ändern 3rd-party-software. Auch mein Prozess getötet werden dürfen mit SIGKILL, ohne für immer...
- FYI node-dev - sendet eine
SIGTERM
ist abfangbar.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Andere Leute haben erwähnt, Sie können nichts tun, in Reaktion auf SIGKILL, das ist im Allgemeinen, warum
forever
(und alle anderen) sollte man nicht mit SIGKILL außer in extremen Umständen. So dass die beste Sie tun können, ist zu bereinigen, die in einem anderen Prozess.Ich schlage vor, Sie bereinigen auf der Startseite. Wenn man
EADDRINUSE
verbinden Sie die Buchse. Wenn die socket-Verbindung erfolgreich ist, wird ein anderer server ausgeführt wird, und so sollte diese Instanz beenden. Wenn die Verbindung fehlschlägt, dann ist es sicher aufheben, die socket-Datei und erstellen Sie eine neue.fs.unlink
sollten Sie passieren einen Rückruf, und starten Sie denserver.listen
wieder auf Rückruf. Diese Weise, die Sie nie versuchen, eine Verbindung herstellen, bevor Sie die Verknüpfung (auch Knoten warntfs: missing callback
wenn Sie nicht mit einer callback).fs.unlink
war synchron, wenn ich das geschrieben habe (ich sicherlich didn ' T erhalten eine Warnung, wenn ich es lief), aber jetzt, dass es eine explizit synchron-version, die ich ersetzt Ihre änderungen mit, dass.sollten Sie in der Lage sein zu verwenden, SIGTERM, das zu tun, was Sie wollen:
process.on('SIGTERM', shutdown)
SIGTERM
, aberforever
Neustart Kind-Prozesse vonSIGKILL
http://nodejs.org/api/net.html#net_server_listen_port_host_backlog_callback
UPD
you cant handle SIGKILL, dann müssen Sie cleanup socket-Handbuch
diesem Beispiel, funktioniert mit forever
EADDRINUSE
im Fall von file-socket-server bedeutet, dass die socket-Datei existiert. Es wird nicht immer schließen oder verschwinden, Ursache " Eltern-app ist bereits tot, getötet mitSIGKILL
Da Sie nicht in den Griff
SIGKILL
und Sie wollen, um für immer zu verwenden (verwendetSIGKILL
), müssen Sie einen workaround.Z. B. zuerst ein signal senden, Herunterfahren Ihrer server und dann tun die immer neu starten:
In Ihrem js handle SIGUSR1:
müssen Sie