2011-11-22 67 views
2

我有一個純Ruby應用程序(這不是一個Web應用程序,所以不使用預現有的平臺狀的軌道,屈...)連續數據處理。如何軟重啓一個紅寶石應用程序?

我打算用Capistrano部署它,並簡單地使用ruby​​命令啓動它。問題是我通過批量獲取數據,並且可能需要幾分鐘時間來處理它們。

當我部署新版本時,我想介紹一個軟重啓,這意味着應用程序將首先通知有關新部署:因此它可以完成批處理,然後說'我準備好了更新「(部署腳本將等待該消息)。

有任何寶石是什麼?也許Capistrano包含這個選項?

+0

你需要更具體的有關應用程序。例如,使用Unicorn運行機架應用程序(Rails,Sinatra,Padrino等),您只需將USR2信號發送到獨角獸主進程,它將啓動一個新的獨角獸進程而不會殺死舊進程,編寫舊的PID文件然後,當新工作人員啓動時,向舊工作人員(從舊的PID文件)發送QUIT ...在QUIT後,舊工作人員在完成處理後關閉。你的問題是沒有一些背景太模糊;) – d11wtq

+0

好吧,會加上一句:它基本上是一個普通的Ruby應用程序(而不是Web應用程序的話),在服務器上,我會簡單地用「紅寶石app.rb」 –

回答

2

允許應用程序陷阱POSIX信號。看看Signal class

如果發送kill <signal type>的過程中,任何信號處理程序將被調用,不管什麼樣的過程,目前正在做。例如,您可以設置某種在您的邏輯中的某個敏感點進行檢查的標誌(例如,在運行循環結束時),如果設置了該標誌,則會終止該進程。有many signals,你可以迴應,但SIGHUPSIGUSR信號的一個可能讓你感覺在做什麼......你可以到你在任何你喜歡的方式喜歡的任何信號作出響應,但它是有道理允許默認行爲的大多數典型處理的行爲(如SIGTERMSIGKILL)。對於非常複雜的東西,您實際上可以接受一系列編碼信號來觸發特定事件。

Signal.trap("HUP") do 
    puts "Huh?" 
end 

loop do 
    puts "Looping..." 
    sleep 2 
end 

輸出

[[email protected]:~%] ruby sig_demo.rb 
Looping... 
Looping... 
Looping... 
Looping... 
Looping... 
Huh? 
Looping... 
Looping... 
Looping... 
Huh? 
Looping... 
Looping... 
Looping... 

因爲在另一個終端窗口我做:

[[email protected]:/usr/local%] ps aux | grep ruby 
chris   69487 0.0 0.0 2425480 188 s005 R+ 11:26pm 0:00.00 grep ruby 
chris   69462 0.0 0.1 2440224 4060 s004 S+ 11:26pm 0:00.03 ruby sig_demo.rb 
[[email protected]:/usr/local%] kill -HUP 69462 
[[email protected]:/usr/local%] kill -HUP 69462 
+0

剛開始它我一直在尋找的類,謝謝:) –