Einfache Möglichkeit, abgestürzte Prozesse neu zu starten?

10

Ich muss mehrere Prozesse überwachen, die auf meinem Webserver ausgeführt werden. Aus irgendeinem Grund stürzt der Lack derzeit alle ein oder zwei Tage ab. Ich benutze monit, um den Lack angeblich automatisch neu zu starten, aber es funktioniert nicht. Hier ist mein monit.conf-Eintrag für Varnish.

check process varnish with pidfile /var/run/varnish.pid
    start program = "/etc/init.d/varnish start" with timeout 60 seconds
    stop program = "/etc/init.d/varnish stop"
    if failed host <my server ip> port 80 protocol http
        and request "/blank.html" then restart
    if 3 restarts within 5 cycles then timeout
    group server

Die Protokolldatei zeigt, dass nach dem Ende der Lackierung der versuchte Neustart danach alle fehlschlagen. Dann hört monit schließlich auf, den Lack zu überwachen.

Hat jemand Vorschläge, wie ich das beheben kann? Oder noch besser, können Sie andere einfache Möglichkeiten vorschlagen, um abgestürzte Prozesse automatisch zu überwachen und neu zu starten? Vielen Dank!

Lin
quelle
Ich kann nicht glauben, wie schwierig solche Dinge in Zeiten vor dem System waren.
Fl0v0

Antworten:

17

Ich würde mich bei daemontools umsehen ( http://cr.yp.to/daemontools.html ).

Supervise wurde genau zu diesem Zweck entwickelt - um Prozesse zu starten und zu überwachen und sie sofort neu zu starten, falls sie jemals beendet werden.

Sie können weiterhin monit verwenden, wenn Sie etwas Komplizierteres als eine einfache Überprüfung "Wird es noch ausgeführt" durchführen müssen. Wenn der Prozess neu gestartet werden muss, tun Sie dies durch Überwachung.

Ian Clelland
quelle
Ich benutze die Daemontools auch zur Überwachung instabiler Serviceprozesse. Sehr praktisch, wenn ich sagen müsste. :-)
Edomaur
4

Sie können auch / etc / inittab verwenden , um tote Prozesse mithilfe der Respawn- Aktion neu zu starten .

Siehe inittab-Abschnitt unter http://aplawrence.com/Unixart/startup.html

Shawn Chin
quelle
2

Sie können Event-Handler-Skripte mit Nagios verwenden, wenn Sie diese zum Neustarten von Diensten eingerichtet haben.

Wenn für den Lack zum Starten eine Root-Berechtigung erforderlich ist (Init.d-Skripte normalerweise), ändern Sie "/etc/init.d/varnish start" in "sudo /etc/init.d/varnish start". Aber das wird wahrscheinlich nicht genug sein, da Sie wahrscheinlich nicht alle Benutzerüberwachungen als totale sudo nopasswd-Berechtigungen für alle Befehle erteilen möchten und sudo für ein Shell-Skript grundsätzlich genauso schlecht wäre. Sie müssen also herausfinden, welche Befehle in diesem Init-Skript sudo benötigen, diese Befehle sudo-Berechtigungen in der Datei / etc / sudoers dem Monit-Benutzer erteilen und das Init-Skript schließlich entsprechend bearbeiten. Oder kann stattdessen anstelle all dieser Lack als Nicht-Root-Benutzer ausgeführt werden?

Schließlich bin ich mir sicher, dass Sie das wissen, aber ich werde es trotzdem sagen. Sie geben sich offensichtlich viel Mühe, ich hoffe, Sie geben sich ebenso viel Mühe, um herauszufinden, warum der Lack abstürzt, und um ihn tatsächlich zu reparieren (oder um die Entwickler zu verfolgen, um herauszufinden, warum) :-)

Update:
Dies ist möglicherweise nicht so sauber, aber eine einfache Möglichkeit, dies als Root zu erledigen, besteht darin, ein Skript einzurichten, das prüft, ob der Prozess in Ordnung ist, und wenn es nicht gestartet wird. Führen Sie das Skript dann alle paar Minuten als Cron-Job aus.

Kyle Brandt
quelle
Zuerst dachte ich über Nagios nach, wollte aber etwas Kleines und Einfaches für meine Zwecke. Und ja, ich beschäftige mich mit dem Thema Lack. Einer meiner Server hat es sehr lange stabil ausgeführt, also hat es definitiv mit mir zu tun. :(
Lin
1

Eine weitere großartige Methode aus StackOverflow :

until myserver; do
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
done

Dies könnte der Crontab hinzugefügt werden:

crontab -e

Fügen Sie dann eine Regel hinzu, um Ihr Monitorskript zu starten:

@reboot /usr/local/bin/myservermonitor

Oder als Skript in hinzugefügt /etc/init.d

In der Antwort von StackOverflow finden Sie eine ausführliche Erklärung, warum dies ein guter Ansatz ist.

Cory Klein
quelle
0

Ich suchte auch nach dem einfachsten Weg, um dieses Problem zu lösen. Der einfachste Weg, den ich finden könnte, besteht darin Restart=allways, die betreffende .serviceDatei einfach /etc/systemd/system/multi-user.target.wants/als letzte Zeile des [service]Tags hinzuzufügen .

Danach kann sudo systemctl daemon-reloaddurch folgte sudo systemctl restart service.servicedie Änderungen neu zu laden.

Sie können testen, indem Sie überprüfen, ob der Dienst ausgeführt wird: systemctl status processnameÜberprüfen Sie den Startzeitstempel. Danach tut ps -ef | grep servicename, Anzeige den Vorgang mit dem gerade gefundenen ID töten kill 1234. Danach systemctl status processnamewiederholen Sie den Vorgang und prüfen Sie, ob der Startzeitstempel aktualisiert wurde.

Es sollte funktionieren auf:

  • Debian 7 und Debian 8
  • Ubuntu 15.04 und neuer
  • CentOS 7 und Futured
RoDo
quelle