2011-11-22 62 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

刚开始它我一直在寻找的类,谢谢:) –