Lösung 1:
Nur den Teil des Dienstneustarts beantworten. Ich bin auch auf Monit gestoßen, aber unter CentOS 7 erledigt systemd das alles für Sie. Sie müssen nur diese beiden Zeilen zur .service-Datei hinzufügen (falls sie noch nicht dort 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, Ihre eigene Dienstdatei zu schreiben. Sehen Sie sich das Beispiel unten für einen benutzerdefinierten HTTP-Server an.
Starten Sie den Editor mit einer neuen Servicedatei:
vim /etc/systemd/system/httpd.service
Und 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
Als Referenz siehe https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/
Lösung 2:
monit
ist eine großartige Möglichkeit, Dienste zu überwachen und neu zu starten, wenn sie ausfallen – und Sie werden dies wahrscheinlich am Ende für andere wichtige Dienste (wie Apache) verwenden. Es gibt einen netten Artikel über nixCraft, der detailliert beschreibt, wie man dies speziell für Dienste verwendet, obwohl monit
selbst hat darüber hinaus noch viele weitere Funktionen.
Was den Socket-Aspekt betrifft, hat @galraen genau hier geantwortet.
Lösung 3:
Sie können setsockopt(2)
anrufen für Abhörbuchse mit SO_REUSEADDR
, also können Sie bind(2)
es erneut, ohne auf das Ablaufen aller Verbindungen zu warten. Eine andere Möglichkeit:Verbindungen vom Kernel trennen. FreeBSD hat tcpdrop
Befehl dafür, keine Ahnung von Linux.
Lösung 4:
Wenn Ihre Linux-Distribution Upstart anstelle von SysV init verwendet, dann wird der respawn
Schlüsselwort tut dies.
http://upstart.ubuntu.com/cookbook/#respawn