Frage Wie man einen Dienst bei einem Fehler in Linux automatisch neu startet


Unter Windows können Sie festlegen, was bei einem Ausfall eines Dienstes geschehen soll. Gibt es eine Standardmethode, um dasselbe auf Linux zu erreichen (insbesondere CentOS)?

Ein größerer Teil meiner Frage ist: Wie geht man mit Sockets um, die offen geblieben sind - zum Beispiel in den Zuständen TIME_WAIT, FIN_WAIT1, etc.

Im Moment, wenn der Dienst, den ich entwickle, abstürzt, muss ich warten, bis die Sockets den Listenport löschen oder ändern, bevor ich ihn manuell neu starten kann.

Danke für Ihre Hilfe.


18
2018-03-26 11:26


Ursprung




Antworten:


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. Da ist ein schöner Artikel über nixCraft Detaillierung darüber, wie dies speziell für Dienste zu verwenden ist monit selbst hat darüber hinaus viel mehr Funktionen.

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


23
2018-03-26 13:50



Es ist eine Schande, dass ich mich entscheiden muss, welches ist das Antworten. Ich hätte zwei getrennte Fragen stellen sollen. @gelraen Deine Antwort hat gerade meine wochenlange Suche nach einer Lösung beendet. Danke so viel! @ Redmumba danke, Monit sieht gut aus! - Pryo
Welches auch immer Sie als richtig markieren, auf jeden Fall upvote @ Gelraens Antwort. Es ist korrekt und sehr informativ. - Andrew M.


Du kannst anrufen setsockopt(2) zum Hören Steckdose mit SO_REUSEADDR, so wirst du es können bind(2) es wieder ohne zu warten, bis alle Verbindungen ablaufen. Eine andere Möglichkeit: Verbindungen vom Kernel trennen. FreeBSD haben tcpdrop Befehl dafür, weiß nicht über Linux.


13
2018-03-26 11:36





Beantworte nur den Service-Neustart-Teil. Ich bin auch auf Monit gestoßen, aber auf CentOS 7 kümmert sich systemd um all das für dich. Sie müssen diese beiden Zeilen nur zur Datei .service hinzufügen (falls sie nicht bereits vorhanden sind):

Restart=always
RestartSec=3

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

Wenn Sie einen benutzerdefinierten Systemdienst erstellen möchten, können Sie ganz einfach eine eigene Servicedatei schreiben. Siehe das folgende Beispiel für 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 Service:

systemctl daemon-reload
systemctl start httpd

Und jetzt können Sie den Status sehen:

systemctl status httpd

Als Referenz, siehe https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/


10
2017-07-13 09:36





Wenn Ihre Linux Distribution Upstart anstelle von SysV init verwendet, dann wird die respawn Schlüsselwort tut dies.

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


4
2018-03-26 13:57



Danke, das sieht genau so aus, aber leider stecke ich mit SysV init fest. - Pryo