我有一个普通的ruby应用程序(它不是一个Web应用程序,所以不使用像rails,sinatra这样的预先存在的平台......)不断处理数据。
我打算用Capistrano部署它,只需用 ruby 命令启动它。问题是我按批次获取数据,处理它们可能需要几分钟。
当我部署新版本时,我想介绍一个软重启,这意味着该应用将首先通知新部署:所以它可以完成批处理,然后说'我准备好进行更新'(部署脚本将等待该消息)。
那有宝石吗?也许Capistrano包括那个选项?
答案 0 :(得分:2)
允许应用程序捕获POSIX信号。看看Signal class。
如果向进程发送kill <signal type>
,则无论进程当前正在执行什么操作,都将调用任何信号处理程序。例如,您可以设置某种标志,该标志在逻辑中的敏感点处检查(例如,在运行循环结束时),如果设置了该标志,则终止该过程。你可以回复many signals,但SIGHUP
或其中一个SIGUSR
信号可能对你正在做的事情有意义......你可以回应你喜欢的任何信号你喜欢的方式,但允许大多数通常处理的(例如SIGTERM
和SIGKILL
)的默认行为是有意义的。对于非常复杂的东西,您实际上也可以接受一系列编码信号来触发特定事件。
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