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

23

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

Ein größerer Teil meiner Frage ist: Wie gehen Sie mit offenen Sockets um - zum Beispiel in TIME_WAIT-, FIN_WAIT1- usw.-Zuständen.

Im Moment, wenn der Dienst, den ich entwickle, abstürzt, muss ich warten, bis die Sockets gelöscht oder der Abhörport geändert wurden, bevor ich ihn manuell neu starten kann.

Danke für Ihre Hilfe.

Pryo
quelle

Antworten:

26

monitDies ist eine großartige Möglichkeit, um Dienste zu überwachen und neu zu starten, wenn sie ausfallen - und Sie werden dies wahrscheinlich für andere wichtige Dienste (wie Apache) verwenden. Es gibt einen schönen Artikel über nixCraft, in dem genau beschrieben wird, wie dies für bestimmte Dienste verwendet wird, obwohl es monitdarüber hinaus noch viel mehr Funktionen gibt.

Was den Sockelaspekt betrifft, hat @galraen diesen Punkt beantwortet.

Andrew M.
quelle
Es ist eine Schande, dass ich mich entscheiden muss, welche die Antwort ist. Ich hätte zwei getrennte Fragen stellen sollen. @gelraen Ihre Antwort hat meine wochenlange Suche nach einer Lösung beendet. Dank Sie so viel! @ Redmumba danke, Monit sieht gut aus!
Pryo
Je nachdem , welche Sie sich entscheiden , markieren richtig, auf jeden Fall upvote @ gelraen Antwort. Es ist genau richtig und sehr informativ.
Andrew M.
19

Antwortet nur auf den Neustart des Dienstes. Ich bin auch auf Monit gestoßen, aber auf CentOS 7 kümmert sich systemd darum. Sie müssen nur diese beiden Zeilen zur .service-Datei hinzufügen (falls sie noch nicht vorhanden sind):

Restart=always
RestartSec=3

Sehen Informationen finden https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/ .

Wenn Sie einen benutzerdefinierten systemd-Dienst erstellen möchten, können Sie ganz einfach eine eigene Dienstdatei erstellen. Das folgende Beispiel zeigt 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

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

Nagev
quelle
Ja, genau, systemdder Standard-Service-Manager für die meisten gängigen Distributionen kann das für Sie tun.
Rolf
13

Sie können rufen Sie setsockopt(2)mit für das Hören Buchse SO_REUSEADDR, so dass Sie in der Lage sein wird , sie bind(2)wieder ohne zu warten , alle Verbindungen auf auslaufen. Eine andere Möglichkeit: Verbindungen vom Kernel trennen. FreeBSD hat einen tcpdropBefehl dafür, weiß nichts über Linux.

gelraen
quelle
4

Wenn Ihre Linux-Distribution Upstart anstelle von SysV init verwendet, wird dies durch das respawnSchlüsselwort ausgeführt.

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

JeffG
quelle
Danke, das sieht genau so aus, aber leider stecke ich bei SysV init fest.
Pryo