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!
Antworten:
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.
quelle
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
quelle
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.
quelle
Eine weitere großartige Methode aus StackOverflow :
Dies könnte der Crontab hinzugefügt werden:
Fügen Sie dann eine Regel hinzu, um Ihr Monitorskript zu starten:
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.
quelle
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.service
Datei einfach/etc/systemd/system/multi-user.target.wants/
als letzte Zeile des[service]
Tags hinzuzufügen .Danach kann
sudo systemctl daemon-reload
durch folgtesudo systemctl restart service.service
die Ä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 tutps -ef | grep servicename
, Anzeige den Vorgang mit dem gerade gefundenen ID tötenkill 1234
. Danachsystemctl status processname
wiederholen Sie den Vorgang und prüfen Sie, ob der Startzeitstempel aktualisiert wurde.Es sollte funktionieren auf:
quelle