Wie kann ich einen Prozess überwachen und automatisch neu starten?


34

Ich möchte einen Prozess, der bei einem Absturz neu gestartet wird. Ich habe ein bisschen gegoogelt und festgestellt, dass die Verwendung von daemontools eine einfache Lösung ist .

Ich habe nicht verstanden, wie ich es konfigurieren soll.

  1. Was ist der einfachste Weg, um eine solche Funktionalität zu erreichen?
  2. Wie konfiguriere ich es?

Antworten:


29

Diese Antwort gilt für Ubuntu-Versionen mit Upstart (<= 14.10). Verwenden Sie einen anderen Ansatz für Versionen mit Systemd (> = 15.04).

Offenbar suchen Sie nach einer Funktionalität, die bereits in Ubuntu mit Upstart bereitgestellt wird . Die respawnZeilengruppe in der Konfiguration wird genau das tun, was Sie benötigen. Ich würde davon abraten, eine weniger übliche Vorgehensweise zu wählen.

Ohne weitere Details zu dem Prozess, den Sie damit verwalten möchten, ist es schwierig zu sagen, wie die Konfiguration aussehen soll. Es kommt darauf an, ob es sich gabelt und sich zum Beispiel in den Hintergrund stellt. In der Upstart-Dokumentation zur respawnZeilengruppe finden Sie weitere Informationen.

Leider ist es noch nicht möglich , Benutzer - Jobs richtig auszuführen: kann Emporkömmling Benutzer Job nicht bekommen laufen

Beispiel

Nehmen wir an, wir möchten die Calculator-App auch dann am Laufen halten, wenn sie durch Feuer getötet wird (Signal 9).

  1. Erstellen Sie eine Konfigurationsdatei in /etc/init/calculator.conf(basierend auf diesem Artikel ):

    #!upstart
    description "Calculator"
    
    # Start job via the daemon control script. Replace "gert" with your username.
    exec su -l gert -c 'export DISPLAY=:0; /usr/bin/gnome-calculator'
    
    # Restart the process if it dies with a signal
    # or exit code not given by the 'normal exit' stanza.
    respawn
    
    # Give up if restart occurs 10 times in 90 seconds.
    respawn limit 10 90
    
  2. Starten Sie es durch Ausführen

    sudo start calculator
    
  3. Es öffnet sich auf Ihrem aktuellen Display ( :0) und Sie können die Großartigkeit genießen, indem Sie sehen, wie es nach dem Schließen neu gestartet wird.

    • Identifizieren Sie die Prozess-ID, z. B . ps aux | grep calculator:

      gert  13695 0.2 0.4 349744 16460 ?   Sl   13:38   0:00 /usr/bin/gnome-calculator
      
    • Töte es mit Feuer.

      sudo kill -9 13695
      
    • Schau es dir nochmal an:

      gert  16059 4.6 0.4 349736 16448 ?   Sl   13:40   0:00 /usr/bin/gnome-calculator
      

Beachten Sie, dass dies mit den Plänen für die Ubuntu 13.04-Pläne mit ordnungsgemäßer Unterstützung für Benutzerjobs eleganter wird.


Ich erhalte einen unbekannten Job, wenn ich versuche, ihn zu starten. irgendeine Idee. Ich habe die Datei in / etc / init
opc0de

@ opc0de Der Name der Datei servicename.confmuss mit dem zu startenden Befehl übereinstimmen start servicename. Ich vermute, Sie haben einen anderen Namen gewählt.
Gertvdijk

Nein, es stimmt überein, aber ich bin Ihrem Beispiel nicht gefolgt. Ich glaube, ich habe einen Syntaxfehler.
opc0de

@ opc0de Erklären Sie zunächst, was Sie in der Frage erreichen möchten: Welche Art von Anwendung / Prozess und wie Sie ihn zum Beispiel ausführen, sowie die Details zu Ihrem aktuellen Versuch.
Gertvdijk

Gelöst mit Ihrem Beispiel war mein Fehler, dass ich wahrscheinlich einen Fehler in der exec-Anweisung hatte. Danke für Ihre Hilfe!
opc0de

13

Ein extrem einfaches Tool, das den gleichen Effekt erzielen kann, ohne dass eine Konfiguration erforderlich ist immortal: https://immortal.run/

Führen Sie einfach den folgenden Befehl aus:

immortal <cmd>

Es wird im Hintergrund ausgeführt und automatisch neu gestartet, wenn es beendet wird.

  • immortalctl: Status der ausgeführten Jobs anzeigen. Es gibt eine nameSpalte, die hier gedruckt wird. Sie können diese verwenden, um auf den Job mit anderen Steuerbefehlen zu verweisen.
  • immortalctl stop <name>: Stoppt die Überwachung des Jobs mit dem angegebenen Namen (es wird nicht automatisch neu gestartet, aber der aktuelle Prozess wird weiterhin ausgeführt)
  • immortalctl -k <name>: Sendet SIGKILL an den aktuellen Prozess.
  • immortalctl exit <name>: Stoppt die Überwachung des Jobs mit dem angegebenen Namen und entfernt ihn aus der Jobliste.

1
Vielen Dank, das hat in meinem Anwendungsfall vom 16.04. Stecke dies in meine Tasche mit nützlichen Werkzeugen.
Quentin Skousen

2
In der Tat sieht dies leichter aus als Upstart / Respawn.
Sridhar Sarnobat

Gibt es eine Möglichkeit , um es anzuzeigen zu lassen stdoutund stderrim Vordergrund?
David S.

Mir ist keines bekannt, da es normalerweise verwendet wird, um einen Prozess im Hintergrund auszuführen. Sie können jedoch verwenden immortalctl -l out.log <cmd> && tail -f out.log, um den gleichen Effekt zu erzielen.
Extropic-Engine

@ DavidS. Sie könnten ein kombiniertes Protokoll erhalten oder stdout und stderr immortal.run/post/stderr
nbari

1

Wenn Sie keine Daemon- / Service- / Hintergrundprozessfunktionalität benötigen und diese nur in der Konsole ausführen möchten, erstellen Sie eine Datei mit dem Namen autorestart.sh:

#!/bin/bash

while [ 1 ]; do
  some_command
done

Dann ./autorestart.shwird automatisch neu gestartet , some_commandwenn er oder Abstürze beendet. STRG-C unterbricht die Schleife und beendet das Programm sauber.

Getestet unter Ubuntu 18.04.


0

Es gibt einen Weg ohne "Upstart". Das Schlüsselwort lautet "inittab" :-). Obwohl dies eine Datei ist, die normalerweise nicht vom Standard geändert wird, kann sie verwendet werden, um auf SYSV-Computern das gewünschte erneute Wiederherstellen zu erreichen.


Ich verstehe nicht, warum jemand diese Lösung ablehnte. Wenn Sie es nicht verstehen, googeln Sie es einfach. es ist sinnlos, hier die manpages von initttab auszuschneiden und einzufügen, sie können sie selbst auf ihrem system lesen!
Gib

13
Hochwertige Antworten enthalten mehr Details als "Verwenden Sie dies, finden Sie es selbst heraus" :)
Seth

0

ps-watcher ist ein Tool, das überwacht, welche Prozesse ausgeführt werden und eine Aktion unter definierten Umständen ausführt. Lass es uns installieren:

apt-get install ps-watcher

Weitere Informationen finden Sie unter Ausführen von HHVM mit Rückgriff auf PHP-FPM. Dies hat bei mir gut funktioniert.


Da es nicht sehr lang ist, fügen Sie bitte eine Zusammenfassung des Codes anstelle des Artikels hinzu, da für diese Frage nur ein sehr kurzer Abschnitt gilt.
derHugo

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.