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


24

Eigentlich bin ich mir nicht so sicher, ob ich Shellskripte verwenden soll oder ob es schon einige Möglichkeiten gibt. Aber wie auch immer wir vorgehen, ich möchte, dass ein Dienst die ganze Zeit läuft.

Sagen wir iptablesals Beispiel. Dann ..

  • Wann immer der iptablesDienst ausgeführt wird stoppedoder (mit anderen Worten) nicht ausgeführt wird, möchte ich, dass er started(oder restarted) automatisch ausgeführt wird, wenn er angehalten wird (oder nicht ausgeführt wird).
  • Mit anderen Worten, ich möchte, dass ein Dienst die ganze Zeit läuft.

(Möglicherweise kann ich eine angemessene Häufigkeit für die Überprüfung angeben, wenn die Echtzeitprüfung das Problem ist. Nehmen wir also an, alle 5 Minuten.)

Die einzige Möglichkeit, die ich mir vorstellen kann, ist die Verwendung von Shell-Skripten mit Cron Tab.

  • Gibt es bitte eine clevere Lösung?

Vielen Dank!


Das solltest du nicht tun. Angenommen, ein Service ist schlecht konfiguriert. Was würde Ihre Strategie bewirken? Eine unendliche Liste von Neuversuchen. Sie sollten stattdessen ein Crontab-Skript schreiben, das alertsIhnen zu etwas nicht passt.
MariusMatutiae

Ich bin nur neugierig auf die klare Lösung für die ursprüngliche Frage. Außerdem habe ich einen Service, der einfach restartedimmer dann verfügbar sein muss, wenn er aus irgendeinem Grund gestoppt wurde. Kein Problem beim Neustart.
夏 期 劇場

1
Ihr eigener Lösungsvorschlag ist klug genug. Wenn Sie es richtig verwenden (sofort beenden, wenn der Dienst bereits ausgeführt wird, benachrichtigen Sie, dass der Dienst angehalten wurde, damit Sie ihn beheben können usw.), ist dies der einfachste Weg. Ein Dienst, der automatisch beendet wird, ist ein problematischer Dienst, daher sollten Sie ihn eventuell beheben. Andernfalls können Sie ihn als temporären Patch, als Cron-Skript oder als einen anderen supereinfachen Daemon verwenden, der die meiste Zeit im Ruhezustand ist. Es gibt einige Tools wie mmonit.com/monit, aber ich denke, dass letztendlich alle einen ähnlichen Ansatz

@MariusMatutiae, ich stimme Ihrem Punkt zu, aber es hängt von der Art des Service ab, und die meisten Prozessmanager werden nach einer Reihe von fehlgeschlagenen Neustarts zurücktreten. Es ist durchaus sinnvoll, dass ein Prozess auf natürliche Weise beendet wird und dass wir ihn automatisch neu starten möchten, z. B. ein Mitarbeiter, der einen Auftrag aus einer Warteschlange aufnimmt und nach jedem Durchlauf endet. Es ist auch ein praktisches Tool für Systemadministratoren, die unter maßgeschneidertem Speicherleck leiden - begrenzen Sie die Lebensdauer eines Prozesses und starten Sie ihn automatisch neu, bevor er außer
Alex Forbes

Antworten:


25

Update März 2018

Diese Antwort ist mittlerweile ziemlich alt, und seit es geschrieben wurde, hat systemd den PID1-Krieg gegen Linux gewonnen. Daher sollten Sie wahrscheinlich eine systemd- Unit erstellen , wenn systemd in Ihre Distribution integriert ist (was die meisten davon sind).

Die Antwort unten wird für die Nachwelt aufbewahrt.


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

Beachten Sie, dass Ihr Betriebssystem das Prozessmanagement-Problem bereits gelöst hat. Traditionell hat Linux sysvinit verwendet. Dies ist im Grunde die Sammlung von Skripten, die Sie in init.d sehen. Es ist jedoch ziemlich dumm und kann keine Prozesse überwachen, init.d-Skripte sind kompliziert und werden aus gutem Grund ersetzt.

Modernere Betriebssysteme beginnen, sysvinit zu ersetzen, und die Spitzenreiter sind Upstart und Systemd. Debian neigt zu systemd, Ubuntu hat sich entwickelt und ist bereits zu Upstart übergegangen, und wie Debian Redhat / CentOS / Fedora bewegen sich auch Debian Redhat / CentOS / Fedora zu systemd. Wenn Sie also ein Betriebssystem verwenden, das sysvinit bereits ersetzt hat, würde ich die Verwendung der integrierten Funktionen empfehlen. Die Skripte sind viel einfacher zu schreiben als Init-Skripte.

Ich habe runit benutzt und mag es, aber am einfachsten ist es, supervisor zu benutzen. Es ist auch sehr gut dokumentiert, funktioniert fast überall und ist in allen wichtigen Distributionen enthalten.

Aber was auch immer Sie tun, bitte, bitte, verwenden Sie kein Shell-Skript. Es gibt so viele Dinge, die an diesem Ansatz falsch sind!


wie macht man das mit sysvinit
Horseyguy

12

iptablesist ein schlechtes Beispiel, da es nicht wirklich ein Dienst oder ein Dämon ist, der ausgeführt wird, sondern ein Teil des Kernels. Sie können nicht wirklich "anhalten" iptables, Sie können ihm nur eine Konfiguration geben, und "anhalten" bedeutet, dass Sie ihm eine leere Konfiguration geben. Ich hatte zwar einen Absturz von Linux-Systemen, aber das Setup für die Portweiterleitung mit iptablesfunktioniert weiterhin.

Wie auch immer, ein Dienstprogramm namens monitwird tun, was Sie wollen. Wenn Sie Debian verwenden, ist es eine apt-get install monitAbwesenheit. Es ist ein bisschen umständlich zu lernen, aber sehr flexibel.


3

Wir verwenden dieses einfache Skript, um eine Warnung zu erstellen und den Dienst zu starten, wenn er nicht ausgeführt wird. Sie können 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

MariusMatutiaes Argument ist richtig, aber wir haben ein einfaches Skript erstellt, um den HTTPD- und DNS-Dienst auf meinem Server zu überwachen. Wenn der Dienst ausfällt, wird das Skript den Dienst neu starten und eine Warnung an uns senden. Es werden viele Warnungen / E-Mails bezüglich des Dienstes angezeigt, und wir können eine Untersuchung durchführen.
Ranjithkumar T


0

Ich weiß, dass es einige Jahre her ist, seit die Frage gestellt wurde. aber mit dem systemd (meistens mit centos und REHL verfügbar) können Sie diesen bash-Befehl mit cron ausführen, um zu überprüfen und neu zu starten, ob der Dienst nicht verfügbar 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 nennen Sie es wie Monitor. Erteilen Sie ihm die entsprechende Dateiberechtigung. dann starte es wie

sudo monitor redis

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

Zuletzt fügen Sie dies zu Ihrem Cron-Job hinzu.

hoffe, das wird helfen


0

Um die lange Liste der init / svc-Überwachung zu erweitern, befindet sich als Unterverzeichnis zu S6 ein neues Kind im Block, 66, das die Verwaltung und Protokollierung von s6-Diensten schnell, einfach und benutzerfreundlich erledigt. Dies ist der Link zur offiziellen Dokumentation für Obarun-Linux https://web.obarun.org/software

Dies ist eine FAQ zur Verwendung dieser 66-Software und zum Verständnis von s6 http://sysdfree.wordpress.com/266

Seit seiner stabilen Veröffentlichung wurde nur ein Fehler in Bezug auf Kernel-Änderungen von 4.20 -> 5.0 gefunden. Alle anderen gemeldeten Probleme hatten damit zu tun, dass Leute etwas Neues lernten. Wenn das Service-Management einfacher werden soll, ist es möglicherweise besser, auf ms-windows umzusteigen (Linus verbietet). Um im wirklichen Leben zu sehen, wie das funktionieren kann, muss man nur ein Obarun live.iso herunterladen und damit spielen. Installieren Sie Dienste und deren 66-Skripte, um sie zu aktivieren, zu beenden, ihre Protokolle anzuzeigen, zu stoppen und zu starten (sofern aktiviert), um Dienste in einem Baum zu bündeln und um Dienstbäume zu starten und zu stoppen, um Dienste auf Benutzerebene separat zu haben vom System. Es macht das, was s6 gut kann, und erleichtert dem Benutzer die Nutzung des kugelsicheren Systems unter s6.

Bild-Downloads finden Sie hier: https://web.obarun.org/index.php?id=74 md5 check files https://repo.obarun.org/iso/

Abgesehen von init und Service Management hat s6 / 66 keinerlei Abhängigkeiten von irgendetwas anderem im System. Es ist eine Schicht des Basissystems, die es dem Rest der Software überlässt, selbstständig zu arbeiten, init / svc-mgmt blind. Alle s6 und 66 sind in C geschrieben und nicht linux- oder glibc-spezifisch. Die Server von Skarnet (s6-Autoren) laufen seit fast einem Jahrzehnt ohne viele Pausen auf einem benutzerdefinierten System. Alpine, Void und Adelie haben derzeit auch s6-Software in ihren Repositories, Adelie verwendet sie standardmäßig für die Serviceüberwachung. Leere trägt jetzt auch 66. Ich weiß nicht, ob und inwieweit jemand s6 auf xxBSD oder andere xxIX-Systeme portiert hat.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.