Haben Sie jemals stundenlang an einer Node.js-Anwendung gearbeitet, sie mit pm2 gestartet und dann frustriert festgestellt, dass sie abstürzt, sobald Sie Ihre Termius-Sitzung schließen? Das ist ein häufiges Problem, das viele Entwickler betrifft, und es gibt glücklicherweise einfache Lösungen, um es zu beheben. In diesem Artikel werden wir die Ursachen für dieses Verhalten untersuchen und Ihnen Schritt für Schritt zeigen, wie Sie verhindern können, dass pm2 Ihre Prozesse beendet, wenn Sie Termius oder eine andere SSH-Client-Anwendung schließen.
Das Problem: SIGHUP und die Bedeutung der Persistenten Prozessverwaltung
Der Grund, warum Ihre pm2-Prozesse beendet werden, wenn Sie Termius schließen, liegt an einem Signal namens SIGHUP (Signal Hang Up). Wenn Sie sich über SSH (wie mit Termius) mit einem Remote-Server verbinden, erstellen Sie eine Shell-Sitzung. Wenn Sie diese Sitzung schließen, sendet die Shell ein SIGHUP-Signal an alle laufenden Prozesse innerhalb dieser Sitzung. Standardmäßig beenden viele Programme, einschließlich pm2, als Reaktion auf dieses Signal. Dies soll verhindern, dass verwaiste Prozesse Ressourcen verbrauchen, nachdem die Sitzung beendet wurde. Allerdings ist dies bei Anwendungen, die dauerhaft im Hintergrund laufen sollen (wie Node.js-Anwendungen, die von pm2 verwaltet werden), unerwünscht.
Die Lösung: pm2 richtig konfigurieren, um SIGHUP zu ignorieren
pm2 ist speziell dafür entwickelt, Anwendungen im Hintergrund persistent zu verwalten. Um sicherzustellen, dass Ihre Prozesse nicht durch das SIGHUP-Signal beeinträchtigt werden, müssen Sie pm2 entsprechend konfigurieren. Hier sind die gängigsten und effektivsten Methoden:
1. pm2 verwenden, um Ihre Anwendung zu starten
Der offensichtlichste, aber wichtigste Schritt ist die Verwendung von pm2 selbst, um Ihre Node.js-Anwendung zu starten. Stellen Sie sicher, dass Sie Ihre Anwendung nicht einfach über `node app.js` oder einen ähnlichen Befehl starten. Stattdessen verwenden Sie den pm2-Befehl:
pm2 start app.js --name "MyApplication"
Dieser Befehl startet Ihre `app.js`-Datei und gibt ihr den Namen „MyApplication”. pm2 überwacht den Prozess dann automatisch und startet ihn neu, falls er abstürzt. Der `–name`-Parameter ist optional, aber sehr empfehlenswert, da er die Verwaltung Ihrer Prozesse erleichtert.
2. Das „nohup”-Kommando (nicht empfohlen für pm2)
Obwohl „nohup” (no hang up) eine traditionelle Methode ist, um Prozesse von SIGHUP zu isolieren, wird sie *nicht* für die Verwendung mit pm2 empfohlen. pm2 bietet robustere und besser integrierte Funktionen für die Prozessverwaltung. Die Verwendung von „nohup” in Verbindung mit pm2 kann zu unerwartetem Verhalten und Konflikten führen. Ich erwähne es hier nur, damit Sie es nicht als Lösung in anderen Ressourcen finden und anwenden, wenn Sie pm2 verwenden. Es ist besser, sich auf die pm2-eigenen Methoden zu konzentrieren.
3. Sicherstellen, dass pm2 als Daemon läuft
pm2 muss als Daemon laufen, um sicherzustellen, dass es auch dann weiterläuft, wenn Ihre SSH-Sitzung beendet wird. Nach der Installation von pm2 sollten Sie den Daemon mit dem folgenden Befehl starten:
pm2 startup
Dieser Befehl generiert einen Befehl, den Sie ausführen müssen, um pm2 beim Systemstart zu konfigurieren. Kopieren Sie den generierten Befehl und führen Sie ihn in Ihrem Terminal aus. Dieser Befehl variiert je nach Betriebssystem und Init-System (systemd, upstart, etc.).
Nachdem Sie diesen Befehl ausgeführt haben, speichert pm2 seine aktuelle Prozessliste und stellt sie beim Systemneustart wieder her. Dies stellt sicher, dass Ihre Anwendungen auch nach einem Serverneustart automatisch neu gestartet werden.
4. pm2 automatisch speichern
Um sicherzustellen, dass alle Änderungen an Ihrer Prozessliste (z. B. das Starten oder Stoppen von Anwendungen) dauerhaft gespeichert werden, verwenden Sie den folgenden Befehl:
pm2 save
Dieser Befehl speichert die aktuelle pm2-Prozessliste, sodass sie beim nächsten Neustart wiederhergestellt werden kann. Es ist eine gute Praxis, diesen Befehl nach jeder Änderung an Ihrer pm2-Konfiguration auszuführen.
5. Überprüfen des pm2-Status
Um den Status Ihrer pm2-Prozesse zu überprüfen, verwenden Sie den folgenden Befehl:
pm2 list
Dieser Befehl zeigt eine Liste aller von pm2 verwalteten Prozesse zusammen mit ihrem Status (online, offline, Fehler usw.), CPU- und Speicherauslastung und anderen Informationen an. Stellen Sie sicher, dass Ihre Anwendung als „online” angezeigt wird.
Fehlerbehebung: Was tun, wenn das Problem weiterhin besteht?
Auch nach Anwendung der oben genannten Schritte kann es in seltenen Fällen vorkommen, dass das Problem weiterhin besteht. Hier sind einige zusätzliche Schritte zur Fehlerbehebung:
- Überprüfen Sie die pm2-Protokolle: pm2 speichert Protokolle für alle verwalteten Prozesse. Diese Protokolle können wertvolle Informationen darüber liefern, warum ein Prozess beendet wurde. Verwenden Sie den Befehl `pm2 logs [App-Name]`, um die Protokolle für eine bestimmte Anwendung anzuzeigen.
- Stellen Sie sicher, dass keine anderen Prozesse stören: Es ist möglich, dass ein anderer Prozess auf Ihrem Server Ihre Node.js-Anwendung stört. Untersuchen Sie die Serverprotokolle und -ressourcen, um festzustellen, ob es Konflikte gibt.
- Aktualisieren Sie pm2: Stellen Sie sicher, dass Sie die neueste Version von pm2 verwenden. Ältere Versionen können Fehler enthalten, die in neueren Versionen behoben wurden. Verwenden Sie den Befehl `npm install -g pm2` zum Aktualisieren.
- Überprüfen Sie Ihre Node.js-Anwendung: Manchmal kann der Fehler in Ihrer Node.js-Anwendung selbst liegen. Stellen Sie sicher, dass Ihre Anwendung keine unbehandelten Ausnahmen oder Fehler enthält, die zum Absturz führen können.
Fazit: Dauerhafte Prozessverwaltung mit pm2
Das Problem, dass pm2-Prozesse beim Schließen von Termius beendet werden, ist ein häufiges, aber lösbares Problem. Durch die korrekte Konfiguration von pm2, insbesondere durch die Verwendung von `pm2 startup` und `pm2 save`, können Sie sicherstellen, dass Ihre Node.js-Anwendungen auch dann persistent laufen, wenn Sie Ihre SSH-Sitzung trennen. Denken Sie daran, regelmäßig den Status Ihrer Prozesse zu überprüfen und die pm2-Protokolle zu analysieren, um Probleme schnell zu erkennen und zu beheben. Mit den richtigen Schritten können Sie pm2 effektiv für die zuverlässige und dauerhafte Verwaltung Ihrer Node.js-Anwendungen nutzen.