it-swarm.com.de

So starten Sie einen Dienst bei einem Fehler unter Linux automatisch neu

Unter Windows können Sie festlegen, was passieren soll, wenn ein Dienst ausfällt. Gibt es eine Standardmethode, um unter Linux dasselbe zu erreichen (insbesondere CentOS)?

Ein größerer Teil meiner Frage lautet: Wie gehen Sie mit Sockets um, die offen gelassen wurden - beispielsweise in den Zuständen TIME_WAIT, FIN_WAIT1 usw.

Im Moment, wenn der Dienst, den ich entwickle, abstürzt, muss ich warten, bis die Sockets den Listen-Port gelöscht oder geändert haben, bevor ich ihn dann manuell neu starten kann.

Danke für Ihre Hilfe.

26
Pryo

monit ist eine großartige Möglichkeit, Dienste zu überwachen und neu zu starten, wenn sie fehlschlagen - und Sie werden dies wahrscheinlich für andere wichtige Dienste (wie Apache) verwenden. Es gibt einen Netter Artikel über nixCraft , der ausführlich beschreibt, wie dies speziell für Dienste verwendet wird, obwohl monit selbst darüber hinaus viel mehr Funktionen hat.

Was den Socket-Aspekt betrifft, hat @galraen diesen Punkt beantwortet.

26
Andrew M.

Beantwortung nur des Teils zum Neustart des Dienstes. Ich bin auch auf Monit gestoßen, aber unter CentOS 7 kümmert sich systemd um all das für Sie. Sie müssen nur diese beiden Zeilen zur .service-Datei hinzufügen (falls sie noch nicht vorhanden sind):

Restart=always
RestartSec=3

Siehe https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/ als Referenz.

Wenn Sie einen benutzerdefinierten systemd-Dienst erstellen möchten, ist es ziemlich einfach, eine eigene Dienstdatei zu schreiben. Im folgenden Beispiel finden Sie einen benutzerdefinierten http-Server.

Starten Sie den Editor mit einer neuen Servicedatei:

vim /etc/systemd/system/httpd.service

Fügen Sie den folgenden Inhalt hinzu, den Sie nach Bedarf bearbeiten können:

[Unit]
Description=My httpd Service
After=network.target

[Service]
Type=simple
User=root
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PERLLIB=/Perl
ExecStart=/bin/httpd /etc/httpd.conf
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

Ich möchte, dass es beim Booten automatisch startet:

systemctl enable httpd

Informieren Sie systemd über die Änderungen und starten Sie den Dienst:

systemctl daemon-reload
systemctl start httpd

Und jetzt können Sie den Status sehen:

systemctl status httpd

Referenz finden Sie unter https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/

24
Nagev

Sie können setsockopt(2) für den Listening-Socket mit SO_REUSEADDR Aufrufen, damit Sie bind(2) es erneut ausführen können, ohne auf den Ablauf aller Verbindungen zu warten. Eine andere Möglichkeit: Verbindungen vom Kernel trennen. FreeBSD hat dafür den Befehl tcpdrop, weiß nichts über Linux.

13
gelraen

Wenn Ihre Linux-Distribution Upstart anstelle von SysV init verwendet, führt dies das Schlüsselwort respawn aus.

http://upstart.ubuntu.com/cookbook/#respawn

4
JeffG