So überwachen Sie einen Dienst und starten ihn neu, wenn er unter Linux gestoppt wird

Eigentlich bin ich mir nicht so sicher, ob ich Shell-Skripte verwenden soll oder ob es bereits einige Möglichkeiten gibt. Aber egal welchen Ansatz wir verwenden, ich möchte einen Dienst die ganze Zeit laufen lassen.

Sagen wir als Beispiel iptables. Dann ..

  • Wenn der Dienst iptables stopped oder (mit anderen Worten) nicht ausgeführt wird, möchte ich, dass er started (oder restarted).. automatisch wenn es gestoppt (oder nicht läuft).
  • In anderen einfacheren Worten möchte ich um einen - Dienst ständig am Laufen zu halten.

(Vielleicht könnte ich eine faire Häufigkeit angeben, um zu überprüfen, ob die Echtzeitprüfung das Problem ist. Sagen wir also alle 5 Minuten)

Der einzige Weg, den ich mir vorstellen kann, ist die Verwendung von Shell-Skripten mit Cron Tab.

  • Gibt es bitte eine kluge Lösung?

Dank!

Author: Flimzy, 2013-12-03

5 answers

Update März 2018

Diese Antwort ist jetzt ziemlich alt, und seit sie geschrieben wurde, hat systemd den pid1-Krieg unter Linux gewonnen. Daher sollten Sie wahrscheinlich eine systemd - Einheit erstellen, wenn systemd in Ihre Distribution integriert ist (was die meisten davon sind).

Antwort unten ist für die Nachwelt erhalten.


Die obige Monit-Antwort ist gültig, aber ich dachte, ich würde einige Alternativen erwähnen:

Es ist zu beachten, dass Ihr Betriebssystem das Problem der Prozessverwaltung bereits gelöst hat. Traditionell hat Linux sysvinit verwendet, das im Grunde die Sammlung von Skripten ist, die Sie in init sehen.d.... Allerdings ist es ziemlich dumm und kann Prozesse nicht überwachen, init.d Skripte sind kompliziert und es wird aus gutem Grund ersetzt.

Modernere Betriebssysteme beginnen, sysvinit zu ersetzen, und die Spitzenreiter sind Upstart und Systemd. Debian neigt sich zu systemd, Ubuntu entwickelt und hat so ziemlich bereits zu Upstart übergegangen, und wie Debian Redhat/CentOS/Fedora bewegen sich in Richtung systemd. Wenn Sie also ein Betriebssystem verwenden, das sysvinit bereits ersetzt hat, würde ich empfehlen, das Integrierte zu verwenden. Die Skripte sind viel einfacher zu schreiben als init-Skripten.

Ich habe runit verwendet und mag es sehr, aber am einfachsten zu verwenden ist Supervisor. Es ist auch sehr gut dokumentiert, funktioniert fast überall und ist in allen wichtigen Distributionen verpackt.

Aber was auch immer du tust, bitte, bitte, BITTE benutze kein Shell-Skript. Es gibt so viele Dinge falsch mit diesem Ansatz!

 27
Author: Alex Forbes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-03-06 11:48:21

iptables ist ein schlechtes Beispiel, da es nicht wirklich ein Dienst oder Daemon ist, der ausgeführt wird, sondern Teil des Kernels. Sie können iptables nicht wirklich "stoppen", Sie können ihm nur eine Konfiguration geben und "stoppen", indem Sie ihm eine leere Konfiguration geben. Tatsächlich sind Linux-Systeme abgestürzt, aber das Setup für die Portweiterleitung mit iptables funktioniert weiterhin.

Eh ein Dienstprogramm namens monit wird tun, was Sie wollen. Wenn Sie Debian verwenden, ist es ein apt-get install monit entfernt. Es ist ein bisschen involviert, etwas darüber zu lernen aber sehr flexibel.

 12
Author: LawrenceC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-12-03 11:26:26

Wir verwenden dieses einfache Skript, um eine Warnung zu erstellen und den Dienst zu starten Wenn er nicht ausgeführt wird, können Sie auch weitere Dienste hinzufügen..

 file name: uptime.sh

 #!/bin/bash
 #service monitoring
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^80$ > /dev/null   2>/dev/null
 a=$(echo $?)
 if test $a -ne 0
 then
 echo "http service down" | mail -s "HTTP Service DOWN and restarted now" root@localhost
 /etc/init.d/httpd start > /dev/null 2>/dev/null
 else
 sleep 0
 fi
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^53$ > /dev/null   2>/dev/null
 b=$(echo $?)
 if test $b -ne 0
 then
 echo "named service down" | mail -s "DNS Service DOWN and restarted now" root@localhost
 /etc/init.d/named start > /dev/null 2>/dev/null
 else
 sleep 0
 fi

 Cron setup:
 */5 * * * * /root/uptime.sh > /dev/null 2>/dev/null
 3
Author: Ranjithkumar T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-12-08 05:50:32

Ich weiß, es ist schon einige Jahre her, seit die Frage gestellt wurde. aber mit dem systemd (meistens verfügbar mit centos und REHL) können Sie diesen Bash-Befehl mit cron ausführen, um zu überprüfen und neu zu starten, ob der Dienst ausgefallen ist.

#!/bin/bash

service=$@
/bin/systemctl -q is-active "$service.service"
status=$?
if [ "$status" == 0 ]; then
    echo "OK"
else
    /bin/systemctl start "$service.service"
fi

Speichern Sie es in Ihrem Bin-Verzeichnis und benennen Sie es wie Monitor. Geben Sie ihm die entsprechende Dateiberechtigung. dann führen Sie es wie

sudo monitor redis

Wenn Sie den Redis-Dienst überprüfen und bei Bedarf neu starten/starten möchten.

Zuletzt füge dies deinem Cron-Job hinzu.

Hoffe dieser helfen

 1
Author: Ahmad Sajid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-03-05 10:36:11

Um der langen Liste der init/svc-Überwachung hinzuzufügen, befindet sich als Unterverzeichnis für S6 ein neues Kind im Block 66, das s6 Service Management und Logging schnell, leicht und benutzerfreundlich handhabt. Dies ist der Link zur offiziellen Dokumentation für Obarun-Linux https://web.obarun.org/software

Dies ist eine der Häufig gestellten Fragen, wie Sie diese 66-software und Sinn machen s6 http://sysdfree.wordpress.com/266

Seit seiner stabilen Veröffentlichung wurde nur ein Fehler gefunden in Bezug auf Kernel-Änderungen von 4.20 - >5.0 hatten alle anderen gemeldeten Probleme damit zu tun, dass Leute etwas Neues lernten. Wenn das Service-Management einfacher werden müsste, könnte es besser sein, zu ms-Windows zu wechseln (Linus verbieten). Um im wirklichen Leben zu sehen, wie das funktionieren kann, muss man nur einen Obarun live herunterladen.iso und spielen mit ihm. Installieren Sie Dienste und ihre Skripte-Skripte aktivieren Sie, töten Sie sie, sehen Sie ihre Protokolle, stoppen Sie sie und starten Sie sie (während aktiviert), bündeln Sie Dienste in einen Baum und haben bäume des Dienstes starten und stoppen alle zusammen, haben Benutzer-Level-Dienste getrennt vom System. Es macht, was s6 gut macht und macht es für den Benutzer einfacher, das kugelsichere System unter s6 auszunutzen.

Bilddownloads finden Sie hier: https://web.obarun.org/index.php?id=74 md5-Prüfdateien https://repo.obarun.org/iso/

Abgesehen von Init und Service Management haben s6/66 keine Abhängigkeiten von irgendetwas anderem auf dem System. Es ist eine Schicht der Basis system verlassen den Rest der Software auf eigene Faust zu arbeiten, init / svc-mgmt blind. Alle s6 und 66 sind in C geschrieben und nicht Linux-spezifisch oder glibc-spezifisch. Die Server von Skarnet (s6g) laufen seit fast einem Jahrzehnt ohne viele Pausen auf musl Custom Built System. Alpine, Void und Adelie haben derzeit auch die Software in ihren Repositorys, Adelie verwendet sie standardmäßig für die Serviceüberwachung. Void trägt jetzt auch 66. Ich weiß nicht, ob und in welchem Umfang jemand hat portierte s6 auf xxBSD oder andere xxIX-Systeme.

 0
Author: Gus Fun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-05-29 10:55:14