Frage Wie starte ich einen Prozess beim Neustart des Servers / Prozess-Exit automatisch?


Auf meinem Ubuntu-Server verwende ich Gott um einige Ruby-Prozesse / Skripte einschließlich eines Queue-Systems zu überwachen.

Gott überprüft automatisch, wenn einer meiner Prozesse existiert und startet ihn neu. Es speichert außerdem die Speichernutzung und verhält sich ordnungsgemäß, wenn bestimmte Bedingungen ausgelöst werden. Heute habe ich den Server neu gestartet und nach einer Weile merkte ich, dass meine Warteschlange funktionierte. Nach einer kurzen Überprüfung entdeckte ich, dass Gott nach dem Serverneustart nicht neu gestartet wurde (ich vermutete, dass es das tun sollte).

Was ist der beste Weg um sicherzustellen, dass Gott (oder ein generischer Prozess) automatisch beim Neustart des Servers neu gestartet wird oder wenn der Prozess aus welchem ​​Grund auch immer beendet wird?

Der spezifische Befehl, den ich benutze, um Gott zu beginnen, ist

god -c config

5
2017-07-25 21:20


Ursprung


Sie können dazu crontab verwenden. Es gibt einen Artikel darüber servermonitoringhq.com/blog/how_to_keep_a_job_running_in_linux - Ian Purton


Antworten:


Mehrere Optionen hier. Springe einfach zum letzten Absatz, wenn du eine Empfehlung haben willst, anstatt auch über die anderen zu lesen!

Einfach beim Neustart neu starten ist einfach: fügen Sie es zu /etc/rc.local welche Debian-basierten Distributionen (und viele andere) nach allen anderen Startskripten standardmäßig ausgeführt werden. Ob god fällt nicht in den Hintergrund selbst, du musst dich vielleicht wie folgt an den Befehl halten:

god -c config &

Das oben genannte wird den Prozess nicht neu starten, wenn es getötet wird. Du könntest ein Skript mit den Endlosschleifen schreiben, aber das ist unordentlich und wird Probleme verursachen, wenn du es wirklich töten willst.

Sie könnten auch Ihr eigenes Init-Skript erstellen, das den in /etc/init.d (und verlinkt in /etc/rc.*Dadurch erhalten Sie eine vollständigere Lösung, da Sie die Möglichkeit haben, den Dienst bei Bedarf anzuhalten / zu starten. Dies führt jedoch nicht automatisch dazu, dass Sie den Dienst für Sie ohne zusätzliche Skripterstellung starten.

Sie könnten es zu Ihrem hinzufügen /etc/inittab, dann init verwaltet den Prozess für Sie, startet ihn beim Booten und startet ihn neu, wenn er abstürzt. Es wird sogar aufhören es neu zu starten, wenn es zu oft in kurzer Zeit stirbt. Das ist aber immer noch nicht perfekt.

Ich denke, der allgemein empfohlene Ansatz für das, was Sie beschrieben haben, ist daemontools (http://en.wikipedia.org/wiki/Daemontools), die auch den Neustart des Dienstes unterstützt, wenn er abbricht. Dies ist ein wenig mehr Arbeit als ein Eintrag in /etc/initab aber Sie werden mit einem viel saubereren Endprodukt enden, das alles tun sollte, was Sie in Ihrer Frage gefragt haben. daemontools sollte in den Repositories von fast jeder Linux-Distribution gefunden werden.


8
2017-07-25 21:34



+1 für Daemontools. - David
Danke David, ich werde wahrscheinlich mit inittab gehen. Ich benutze inittab nicht vorher, aber es scheint die beste Lösung für jetzt zu sein. Ich werde schließlich Daemontools versuchen. - Simone Carletti
Persönliche Präferenz: Das Tool namens monit ist auf den meisten Distributionen und auf der Homepage verfügbar: mmonit.com/monit - rasjani
@ David - "Du könntest ein Skript schreiben die Endlosschleifen, aber das ist chaotisch und wird Probleme verursachen, wenn du es wirklich töten willst" - Das kann man umgehen, indem man alle Serverdämonen auf ihren eigenen Runlevel setzt und einfach Runlevels in / aus, um mit den entsprechenden /etc/init.d / ... -Skripten zu beginnen. Dies kann jedoch problematisch werden, wenn Sie nur einen bestimmten Daemon starten / stoppen wollen. Keine Ursache... - J. Polfer
@David Wie vergleicht sich monit mit daemontools? - SAFX


Wenn Sie sicherstellen möchten, dass der Prozess immer ausgeführt wird, ist inittab die vernünftige Methode, um den Prozess zu starten, da er den Prozess neu startet, wenn er abbricht. Aber ich würde es nicht so machen, als ob es scheitern würde. Ich würde das eher früher als später entdecken, da sich mein Code verbessern würde und es weniger wahrscheinlich wäre, die Maschine instabil zu machen.

Wenn Sie Root-Zugriff haben, erstellen Sie ein Init-Skript in /etc/init.d und verwenden Sie dann update-rc.d, um die korrekten symbolischen Links in den Runlevel-Verzeichnissen zu erstellen. Ein Beispielskript würde aussehen

 #!/bin/bash
 ### BEGIN INIT INFO
 # Provides:          god
 # Required-Start:    $syslog
 # Required-Stop:     $syslog
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
 # Short-Description: Runs the ruby god meta server.
 # Description:       Runs the ruby god meta server.
 ### END INIT INFO

 start_daemon () {

        nohup start-stop-daemon --start --quiet -m --pidfile /var/run/god.pid \
        --exec  god -- -c config 
        RETVAL=$?
 }

 stop_daemon () {
    start-stop-daemon --stop --quiet --oknodo -m --pidfile /var/run/god.pid 
    RETVAL=$?
 }


 case "$1" in 

 start)
 start_daemon
 ;;
 stop)
 stop_daemon
 ;;
 restart | reload | force-reload )
 stop_daemon
 start_daemon
 ;;
 esac

Wenn Sie nur ein normaler Benutzer sind, könnten Sie cron verwenden, um Prozesse beim Booten auszuführen, indem Sie die Startzeit als angeben @reboot

@reboot god -c config

3
2017-07-25 21:44



+1 für @reboot. Ich lerne jeden Tag etwas Neues! - David Spillett
Danke für dieses personalisierte Skript. Es ist nützlich, god in einer Zeile zu starten / zu stoppen, ohne immer Optionen und Einstellungen anzugeben. - Simone Carletti


Sie müssen ein init.d-Skript dafür schreiben, um Gott zu starten und zu stoppen. Sie können ein beliebiges Skript unter /etc/init.d als Beispiel verwenden. Rufen Sie Ihr neues Skript /etc/init.d/god auf. Sie können dann ausführen

# update-rc.d god defaults

und es sollte sicherstellen, dass es beim Hoch- und Herunterfahren des Servers startet und stoppt. Sie können feststellen, dass bereits ein init.d-Skript für Gott im Internet verfügbar ist. Ich würde mich schnell umsehen, bevor du dich hinsetzt, um einen zu schreiben.


1
2017-07-25 21:28





Um sicherzustellen, dass Gott es beim Booten neu startet, sollten Sie es zu Init-Skripten hinzufügen. Schreiben Sie dazu ein Skript, das mindestens den Start als Parameter akzeptiert (um den Standards zu folgen, müssten Sie etwas mehr tun als dass) und stecke es in /etc/init.d/. Fügen Sie dann einen Symlink namens S99 zu / etc / rc hinzu [welche Laufebenen Sie auch am Anfang des Skripts verwenden möchten].

Um besser den Standards zu folgen, kopieren Sie /etc/init.d/skeleton an anderer Stelle in /etc/init.d/ und bearbeiten Sie sie passend.


0
2017-07-25 21:31