2016-07-13 22 views
-1

Ich bin sicher, es gibt eine einfache Möglichkeit, dies zu tun, aber ich kann es nicht finden.Wie erzwinge ich, dass Ruby-Programm beim Beenden erneut ausgeführt wird?

Ich möchte einfach, dass mein Ruby-Programm die ganze Zeit läuft, also wenn es aus irgendeinem Grund beendet oder beendet wird, möchte ich es automatisch erneut ausführen.

Irgendwelche Ideen, wie man das erreicht?

-Danke

+0

Ich nehme an, was ich meine ist, wenn mein Programm abstürzt oder beendet oder etwas, gibt es eine Methode, die ich aufrufen kann mit at_exit oder etwas Ähnliches zurückspringen und das Programm erneut ausführen? Eine Art Failsafe. Was macht ein Daemon? –

+0

Nein, das ist nicht wirklich möglich, siehe [this] (http://stackoverflow.com/questions/696839/how-do-i-write-a-bash-script-to-restart-a-process -if-it-stirbt) statt. –

+0

Ich denke, ich habe es. In meinem Hauptcode-Block namens 'main' habe ich at_exit angewiesen, 'main_reboot' aufzurufen, das eine Pause hat und dann 'main' aufruft. Ich weiß nicht, ob das eine Best Practice ist, aber es scheint zu funktionieren. –

Antwort

0

Während Sie diese Art der Sache schreiben selbst, ist es wahrscheinlich besser mit einer Bibliothek wie daemons starten und dass Ihr Prozess zu verwalten verwenden.

Wie in der Readme gezeigt, es ist ziemlich einfach:

require 'daemons' 

Daemons.run('service.rb') 

Wo service.rb der Einstiegspunkt in die Hauptanwendung ist, die Sie behalten möchten Laufen.

Ihr Ansatz, die Anwendung innerhalb des gleichen Ruby-Prozesses erneut zu starten, scheint zu funktionieren, kann aber später Chaos verursachen. Was ist, wenn Ihr Programm in einen Zustand eingetreten ist, in dem irgendetwas zu einer Ausnahme führt und einen Neustart verursacht, der sofort eine neue Ausnahme auslöst? Was ist, wenn es abgestürzt ist, weil der interne Zustand gestört ist?

Lassen Sie es sterben, starten Sie es sauber mit einem Supervisor-Prozess wie Daemons, und Sie werden viel besser dran sein. Diese Supervisors drosseln oft Neustarts, um zu verhindern, dass Ihr Server bei Problemen mit Tausenden von Neustarts pro Sekunde blockiert wird.

0

Die Neustartlogik wird von dem Monitor, den Sie in Ihrem Server verwenden, ordnungsgemäß ausgeführt (Systemd oder Monit können das ziemlich leicht, aber es gibt viele andere).

Wenn Sie einen Dienst machen, den Sie nicht jedes Mal neu starten möchten, weil es zu teuer ist, wird der Prozess in einer Ereignisschleife gehalten, die auf Einkommensanfragen wartet, aber dies wird normalerweise für Sie erledigt Bibliothek, die Sie verwenden, um das Protokoll zu behandeln, so dass Sie nur den Handler für die eingehende Anforderung schreiben.