Ich möchte das beliebte Thor-Gem verwenden, um eine daemonisierte Aufgabe zu erstellen. Meine Thor-Klasse sieht wie folgt aus:
require 'rubygems'
require 'daemons'
require 'thor'
class CLI < Thor
desc "start", "Startup the App"
method_option :daemonize, :aliases => "-d", :default => false, :type => :boolean, :banner => "Run as daemon"
def start
run_app(options[:daemonize])
end
desc "stop", "Stop the daemon"
def stop
stop_app
end
no_tasks {
def run_app(run_as_daemon)
# Run the application code
Daemons.daemonize if run_as_daemon
# loop until stopped or interrupted
# ...
end
def stop_app
#stop the app
end
}
end
Hier habe ich also eine grundlegende Thor-Klasse mit zwei Aufgaben, Start und Stop, eingerichtet. Ich bin auch, derzeit mit der Daemons gem, aber das ist nicht erforderlich. Der Teil, der ich mit kämpfen ist, dass, wenn diese App als "run_thor_app.rb start" läuft alles läuft einfach gut. Offensichtlich ist die Stoppaufgabe in diesem Fall nicht erforderlich. Aber wenn ich "run_thor_app.rb start -d" ausführe, läuft die Anwendung, bis Daemons.daemonize ausgeführt wird, und dann wird sie beendet. Die Überprüfung der laufenden Prozesse zeigt, dass nichts im Hintergrund ausgeführt wird.
Selbst wenn etwas laufen würde, wüsste ich nicht, wie ich die Aufgabe "Stoppen" angehen sollte. Wie erkennt man zum Beispiel, dass die Anwendung als Daemon läuft und stoppt sie. Ich habe mir Daemons::Monitor angesehen, aber die Dokumentation ist nicht klar, wie das funktioniert, und als ich es versuchte, funktionierte es nicht.
Es scheint mir, dass dies ein guter Anwendungsfall für etwas sein würde, das in Thor eingebaut ist, aber die Suche durch den Code auf github hat mir nichts gezeigt. Vielleicht habe ich es nur irgendwo übersehen. Auf jeden Fall denke ich, dass es gut wäre, eine Best Practice oder ein Muster für den Umgang mit Daemons mit Thor zu dokumentieren, damit andere darauf verweisen können.