如何软重启ruby应用程序?

时间:2011-11-22 11:05:19

标签: ruby capistrano

我有一个普通的ruby应用程序(它不是一个Web应用程序,所以不使用像rails,sinatra这样的预先存在的平台......)不断处理数据。

我打算用Capistrano部署它,只需用 ruby​​ 命令启动它。问题是我按批次获取数据,处理它们可能需要几分钟。

当我部署新版本时,我想介绍一个软重启,这意味着该应用将首先通知新部署:所以它可以完成批处理,然后说'我准备好进行更新'(部署脚本将等待该消息)。

那有宝石吗?也许Capistrano包括那个选项?

1 个答案:

答案 0 :(得分:2)

允许应用程序捕获POSIX信号。看看Signal class

如果向进程发送kill <signal type>,则无论进程当前正在执行什么操作,都将调用任何信号处理程序。例如,您可以设置某种标志,该标志在逻辑中的敏感点处检查(例如,在运行循环结束时),如果设置了该标志,则终止该过程。你可以回复many signals,但SIGHUP或其中一个SIGUSR信号可能对你正在做的事情有意义......你可以回应你喜欢的任何信号你喜欢的方式,但允许大多数通常处理的(例如SIGTERMSIGKILL)的默认行为是有意义的。对于非常复杂的东西,您实际上也可以接受一系列编码信号来触发特定事件。

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

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

输出

[chris@chipbook:~%] ruby sig_demo.rb 
Looping...
Looping...
Looping...
Looping...
Looping...
Huh?
Looping...
Looping...
Looping...
Huh?
Looping...
Looping...
Looping...

因为在另一个终端窗口我完成了:

[chris@chipbook:/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
[chris@chipbook:/usr/local%] kill -HUP 69462
[chris@chipbook:/usr/local%] kill -HUP 69462