[英]How can I create a daemon with Thor (ruby)?
我想使用流行的Thor寶石來創建守護進程。 我的雷神課看起來像這樣:
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
因此,在這里,我設置了一個基本的thor類,其中包含兩個任務,即啟動和停止。 我也正在使用Daemons gem,但這不是必需的。 我苦苦掙扎的部分是,當該應用程序以“ run_thor_app.rb start”運行時,一切運行正常。 顯然,在這種情況下不需要停止任務。 但是,當我運行“ run_thor_app.rb start -d”時,該應用程序將運行,直到Daemons.daemonize運行,然后退出。 檢查正在運行的進程表明后台沒有任何運行。
即使正在運行某些內容,我也不知道如何執行停止任務。 例如,如何檢測該應用程序正在作為守護程序運行並停止它。 我已經看過Daemons :: Monitor了,但是文檔尚不清楚它是如何工作的,當我嘗試它時,它沒有工作。
在我看來,這對於Thor內置的東西來說將是一個很好的用例,但是在github上的代碼中搜索並沒有告訴我任何東西。 也許我只是在某個地方錯過了它。 無論如何,我認為最好與Thor一起記錄最佳做法或處理守護程序的模式,以供其他人參考。
通常,管理守護進程的方法是讓它們將PID寫入文件中。 這使另一個進程可以發現守護程序的PID,並殺死它(或發送其他信號)。
您的代碼應該可以工作。 我嘗試了使用deamons
寶石的裸露腳本,花了我幾次嘗試才找到脫氨過程。 我認為它將獲得與父進程相同的名稱,或類似的名稱,但是它的名稱是“ self”。 請記住,守護進程將不再寫入STDOUT
。
無論如何,請嘗試以下操作:
# set up everything
# then daemonize
Daemons.daemonize
# and write a pid file
File.open('/tmp/mydaemon.pid', 'w') { |f| f.puts(Process.pid) }
loop do
# do something
# this loop is important, if the script ends the daemon dies
end
並檢查/tmp/mydaemon.pid
文件中的PID。 然后運行ps ax | grep x
ps ax | grep x
其中x是PID。 運行cat /tmp/mydaemon.pid
| xargs kill`殺死守護程序。
我認為daemons
的gem具有一些用於管理PidFile
幫助程序,請查看http://rubydoc.info/gems/daemons/1.1.0/frames中的 PidFile
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.