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.
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? –
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. –
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. –