Ich versuche also, einen Cron-Job als eine Art Watchdog für einen von mir erstellten Daemon einzurichten. Wenn der Daemon ausfällt und fehlschlägt, möchte ich, dass der Cron-Job ihn regelmäßig neu startet ... Ich bin mir nicht sicher, wie dies möglich ist, aber ich habe ein paar Cron-Tutorials durchgelesen und konnte nichts finden, was das tun würde, was ich tun würde suche ...
Mein Daemon wird von einem Shell-Skript aus gestartet, daher suche ich wirklich nur nach einer Möglichkeit, einen Cron-Job NUR auszuführen, wenn die vorherige Ausführung dieses Jobs noch nicht ausgeführt wird.
Ich habe diesen Beitrag gefunden , der eine Lösung für das bietet, was ich mit Sperrdateien versuche. Ich bin mir nicht sicher, ob es einen besseren Weg gibt ...
Danke für Ihre Hilfe.
grep -v grep | grep doctype.php
dir kanngrep [d]octype.php
.&
das Skript nicht ausgeführt werden muss, wenn es cron ist.Verwenden Sie
flock
. Es ist neu. Es ist besser.Jetzt müssen Sie den Code nicht mehr selbst schreiben. Weitere Gründe finden Sie hier: https://serverfault.com/a/82863
quelle
setlock
,s6-setlock
,chpst
, Undrunlock
in ihrem nicht-blockierende Modi sind Alternativen , die auf mehr als nur Linux zur Verfügung stehen. unix.stackexchange.com/a/475580/5132Wie bereits erwähnt, ist das Schreiben und Überprüfen einer PID-Datei eine gute Lösung. Hier ist meine Bash-Implementierung:
quelle
>
" gegen ">>
" bemerkt . Das tut mir leid.[ -e "${PIDFILE}" ]
". Wenn dies nicht der Fall ist, startet es das Programm im Hintergrund, schreibt seine PID in eine Datei ("echo $! > "${PIDFILE}"
") und Beenden. Wenn die PID-Datei stattdessen vorhanden ist, überprüft das Skript Ihre eigenen Prozesse ("ps -u $(whoami) -opid=
") und prüft, ob Sie einen mit derselben PID ("grep -P "^\s*$(cat ${PIDFILE})$"
") ausführen. Wenn dies nicht der Fall ist, wird das Skript gestartet Programm wie zuvor, überschreiben Sie die PID-Datei mit der neuen PID undEs ist überraschend, dass niemand von Run-One gesprochen hat . Ich habe mein Problem damit gelöst.
run-one
Fügen Sie dann vor Ihrem Crontab-Skript hinzuSchauen Sie sich diese Antwort von askubuntu SE an. Dort finden Sie auch einen Link zu detaillierten Informationen.
quelle
Versuchen Sie nicht, es über Cron zu tun. Lassen Sie cron ein Skript ausführen, egal was passiert, und lassen Sie das Skript dann entscheiden, ob das Programm ausgeführt wird, und starten Sie es gegebenenfalls (beachten Sie, dass Sie dazu Ruby oder Python oder Ihre bevorzugte Skriptsprache verwenden können).
quelle
Sie können dies auch als Einzeiler direkt in Ihrem Crontab tun:
quelle
ps -ef|grep [c]ommand
-eq 0] && <Befehl> geschrieben werden, wobei das Umschließen des ersten Buchstabens Ihres Befehls in Klammern ihn von den Grep-Ergebnissen ausschließt.[ "$(ps -ef|grep [c]ommand|wc -l)" -eq 0 ] && <command>
[ $(grep something | wc -l) -eq 0 ]
ist ein wirklich umständlicher Weg zu schreiben! grep -q something
. Also willst du einfachps -ef | grep '[c]ommand' || command
grep -c
Die Art und Weise, wie ich es mache, wenn ich PHP-Skripte ausführe, ist:
Die Crontab:
Der PHP-Code:
Dieser Befehl sucht in der Systemprozessliste nach dem aktuellen PHP-Dateinamen, falls vorhanden. Der Zeilenzähler (wc -l) ist größer als eins, da der Suchbefehl selbst den Dateinamen enthält
Wenn Sie also PHP-Crones ausführen, fügen Sie den obigen Code am Anfang Ihres PHP-Codes hinzu und er wird nur einmal ausgeführt.
quelle
Als Antwort auf die Antwort von Earlz benötigen Sie ein Wrapper-Skript, das beim Start eine $ PID.running-Datei erstellt und beim Ende löscht. Das Wrapper-Skript ruft das Skript auf, das Sie ausführen möchten. Der Wrapper ist erforderlich, falls das Zielskript fehlschlägt oder Fehler auftreten. Die PID-Datei wird gelöscht.
quelle
Mit müssen
lockrun
Sie kein Wrapper-Skript für Ihren Cron-Job schreiben. http://www.unixwiz.net/tools/lockrun.htmlquelle
Ich würde empfehlen, ein vorhandenes Tool wie monit zu verwenden , das Prozesse überwacht und automatisch neu startet. Weitere Informationen finden Sie hier . Es sollte in den meisten Distributionen leicht verfügbar sein.
quelle
Dieser hat mich nie im Stich gelassen:
one.sh :
Cron Job :
quelle
UPDATE .. besserer Weg mit Herde:
quelle
Ich würde Folgendes als Verbesserung von Rsandens Antwort vorschlagen (ich würde als Kommentar posten, aber nicht genug Ruf haben ...):
Dies vermeidet mögliche falsche Übereinstimmungen (und den Aufwand für das Greppen), unterdrückt die Ausgabe und hängt nur vom Exit-Status von ps ab.
quelle
ps
Befehl würde PIDs für andere Benutzer im System entsprechen, nicht nur für Ihre eigenen. Durch Hinzufügen eines "-u
" zumps
Befehl wird die Funktionsweise des Exit-Status geändert.Einfache benutzerdefinierte PHP ist genug zu erreichen. Keine Notwendigkeit, mit Shell-Skript zu verwechseln.
Nehmen wir an, Sie möchten php /home/mypath/example.php ausführen, wenn es nicht ausgeführt wird
Verwenden Sie dann das folgende benutzerdefinierte PHP-Skript, um den gleichen Job auszuführen.
Erstelle folgendes /home/mypath/forever.php
Fügen Sie dann in Ihrem Cron Folgendes hinzu
quelle
Verwenden Sie pgrep (falls verfügbar) anstelle von ps, das durch grep geleitet wird, wenn Sie diesen Weg gehen möchten. Obwohl ich persönlich eine Menge Kilometer mit Skripten des Formulars habe
Dies kann jedoch fehlschlagen und Cron-Jobs sind oft der beste Weg für wichtige Dinge. Nur eine andere Alternative.
quelle
Dokumente: https://www.timkay.com/solo/
Beispiel
quelle