Ich versuche sicherzustellen, dass ein Skript weiterhin auf einem Entwicklungsserver ausgeführt wird. Es sammelt Statistiken und bietet einen Webdienst, so dass es bestehen bleiben soll, aber einige Male am Tag stirbt es aus unbekannten Gründen ab. Wenn wir bemerken, dass wir es einfach erneut starten, ist es ein Problem, und einige Benutzer haben keine Berechtigung (oder kein Know-how), es zu starten.
Der Programmierer in mir möchte ein paar Stunden damit verbringen, dem Problem auf den Grund zu gehen, aber die beschäftigte Person in mir ist der Meinung, dass es eine einfache Möglichkeit geben muss, zu erkennen, ob eine App nicht ausgeführt wird, und sie erneut zu starten.
Ich weiß , ich könnte cron-Skript ps durch grep:
ps -A | grep appname
Aber auch dies ist eine weitere Stunde meines Lebens, in der ich etwas verschwendet habe, das bereits vorhanden sein muss ... Gibt es nicht eine vorgefertigte App, mit der ich eine ausführbare Datei übergeben kann (optional mit Argumenten) und die einen Prozess auf unbestimmte Zeit laufen lässt?
Falls es einen Unterschied macht, ist es Ubuntu.
/etc/inittab
.Antworten:
Hinweis: Upstart befindet sich im Wartungsmodus und wurde von Ubuntu, das systemd verwendet, abgebrochen . Im Handbuch des Systems finden Sie Einzelheiten zum Schreiben der Dienstdefinition.
Da Sie Ubuntu verwenden, könnte Sie Upstart interessieren , das den traditionellen sysV-Init ersetzt hat . Ein wichtiges Merkmal ist, dass ein Dienst neu gestartet werden kann, wenn er unerwartet stirbt. Fedora ist zum Emporkömmling übergegangen, und Debian befindet sich im Experiment, daher lohnt es sich möglicherweise, einen Blick darauf zu werfen.
Dies kann in dieser Situation jedoch zu viel des Guten sein, da die Implementierung eines Cron- Skripts 2 Minuten dauert.
quelle
Ich habe ein einfaches Skript mit cron verwendet, um sicherzustellen, dass das Programm ausgeführt wird. Wenn dies nicht der Fall ist, wird es gestartet. Dies ist möglicherweise nicht die perfekte Lösung, die Sie suchen, aber es ist einfach und funktioniert ziemlich gut.
Fügen Sie dann jede Minute oder alle 5 Minuten einen Cron-Job hinzu.
quelle
process name
, wenn ich ein Python-Skript am Laufen halten möchte?ps ax | grep XXX
um nur Ihren Prozess aufzulisten. Dann ist es XXX.* * * * * ps aux|grep -v grep|grep -q YourProcessName || /usr/bin/program &
Monit ist perfekt dafür :)
Sie können einfache Konfigurationsdateien schreiben, die monit anweisen, z. B. einen TCP-Port, eine PID-Datei usw. Zu überwachen
monit führt einen Befehl aus, den Sie angeben, wenn der zu überwachende Prozess nicht verfügbar ist / zu viel Speicher verwendet / die CPU zu lange fixiert / etc. Außerdem wird eine E-Mail-Benachrichtigung angezeigt, die Sie darüber informiert, was passiert ist und ob etwas dagegen unternommen werden kann.
Wir verwenden es, um eine Menge unserer Websites am Laufen zu halten und uns frühzeitig zu warnen, wenn etwas schief geht.
- Ihr treuer Angestellter, Monit
quelle
Wenn Sie eine systemd-basierte Distribution wie Fedora und aktuelle Ubuntu-Versionen verwenden, können Sie die "Restart" -Funktion von systemd verwenden für Dienste verwenden. Es kann als Systemdienst oder als Benutzerdienst eingerichtet werden, wenn es von einem bestimmten Benutzer verwaltet und als solcher ausgeführt werden muss, was in der jeweiligen Situation des OP wahrscheinlicher ist.
Die Neustart - Option nimmt einen
no
,on-success
,on-failure
,on-abnormal
,on-watchdog
,on-abort
, oderalways
.Um es als Benutzer auszuführen, platzieren Sie einfach eine Datei wie die folgende in
~/.config/systemd/user/something.service
:dann:
Keine Root-Berechtigung / Änderung von Systemdateien erforderlich, keine Cron-Jobs erforderlich, nichts zu installieren, höllisch flexibel (siehe alle zugehörigen Serviceoptionen in der Dokumentation).
Weitere Informationen zur Verwendung der systemd-Instanz pro Benutzer finden Sie unter https://wiki.archlinux.org/index.php/Systemd/User .
quelle
Ich habe von cron "killall -0 programname || /etc/init.d/programname start" verwendet. kill wird fehlschlagen, wenn der Prozess nicht existiert. Wenn es existiert, liefert es ein Nullsignal an den Prozess (das der Kernel ignoriert und sich nicht die Mühe macht, es weiterzugeben.)
Diese Redewendung ist einfach zu merken (IMHO). Im Allgemeinen verwende ich dies, während ich immer noch versuche herauszufinden, warum der Dienst selbst fehlschlägt. IMHO sollte ein Programm nicht einfach unerwartet verschwinden :)
quelle
Setzen Sie Ihren Lauf in eine Schleife. Wenn er beendet wird, wird er erneut ausgeführt ... while (true) {starte meine App ..}
quelle
Ich konnte Chris Wendt- Lösung aus irgendeinem Grund nicht zum Laufen bringen, und es war schwer zu debuggen. Dieser ist ziemlich gleich, aber einfacher zu debuggen, schließt Bash vom Pattern Matching aus. Zum Debuggen einfach ausführen :
bash ./root/makerun-mysql.sh
. Im folgenden Beispiel mit mysql-server ersetzen Sie einfach den Wert der Variablen fürprocess
undmakerun
für Ihren Prozess.nano /root/makerun-mysql.sh
):Stellen Sie sicher , es ist ausführbar durch die richtigen Dateiberechtigungen Hinzufügen (dh
chmod 700 /root/makerun-mysql.sh
)Fügen Sie dies dann Ihrem crontab (
crontab -e
) hinzu:quelle
Das
supervise
Werkzeug vondaemontools
wäre meine Präferenz - aber dann ist alles, was Dan J Bernstein schreibt, meine Präferenz :)http://cr.yp.to/daemontools/supervise.html
Sie müssen eine bestimmte Verzeichnisstruktur für Ihr Anwendungsstart-Skript erstellen, diese ist jedoch sehr einfach zu verwenden.
quelle
Wie startet man diese App? Gabelt es sich in den Hintergrund? Beginnt es mit nohup .. & etc? Wenn es das letztere ist, überprüfen Sie, warum es in nohup.out gestorben ist. Wenn es das erste ist, erstellen Sie die Protokollierung.
Was Ihre Hauptfrage betrifft: Sie könnten es cronen oder einen anderen Prozess im Hintergrund ausführen (nicht die beste Wahl) und pidof in einem Bashscript verwenden, ganz einfach:
quelle
Sie könnten es zu einem Dienst machen, der von inittab aus gestartet wird (obwohl einige Linux-Versionen in /etc/event.d zu etwas Neuerem übergegangen sind). Diese integrierten Systeme stellen sicher, dass Ihr Dienst weiterhin ausgeführt wird, ohne eigene Skripte zu schreiben oder etwas Neues zu installieren.
quelle
Es ist ein Job für ein DMD (Daemon Monitoring Daemon). es sind ein paar da; Normalerweise schreibe ich jedoch nur ein Skript, das prüft, ob der Dämon ausgeführt wird, und wenn nicht, und stelle es in cron, damit es jede Minute ausgeführt wird.
quelle
nanny
Lesen Sie ' ', auf das in Kapitel 9 (S. 197 oder so ungefähr) des "Unix Hater's Handbook" (eine von mehreren Quellen für das Buch als PDF) verwiesen wird .quelle
Eine schöne, einfache Möglichkeit, dies zu tun, ist wie folgt:
Wenn es nicht läuft, startet es und wenn es läuft, läuft es nicht. In jedem Fall ist Ihr Server immer aktiv.
quelle
Ich denke, eine bessere Lösung ist, wenn Sie die Funktion auch testen. Wenn Sie beispielsweise einen Apache testen mussten, reicht es nicht aus, nur zu testen, ob auf den Systemen "Apache" -Prozesse vorhanden sind.
Wenn Sie testen möchten, ob Apache OK ist, versuchen Sie, eine einfache Webseite herunterzuladen, und testen Sie, ob Ihr eindeutiger Code in der Ausgabe enthalten ist.
Wenn nicht, töte den Apachen mit -9 und starte dann neu. Und senden Sie eine E-Mail an das Stammverzeichnis (eine weitergeleitete E-Mail-Adresse an das Stammverzeichnis des Unternehmens / Servers / Projekts).
quelle
Es ist noch einfacher:
Sie müssen sich jedoch daran erinnern, dass der Prozessname eindeutig ist.
quelle