如何软重启ruby应用程序?

如何软重启ruby应用程序?,ruby,capistrano,Ruby,Capistrano,我有一个普通ruby应用程序(它不是Web应用程序,所以不使用rails、sinatra等现有平台)连续处理数据 我计划用Capistrano部署它,并简单地用ruby命令启动它。问题是我分批获取数据,处理这些数据可能需要几分钟的时间 当我部署一个新版本时,我想引入一个软重启,这意味着应用程序将首先通知新部署:这样它就可以完成批处理,然后说“我准备好更新了”(部署脚本将等待该消息) 有什么宝石吗?也许Capistrano包含该选项?允许应用程序捕获POSIX信号。请看下面的图片 如果向进程发送k

我有一个普通ruby应用程序(它不是Web应用程序,所以不使用rails、sinatra等现有平台)连续处理数据

我计划用Capistrano部署它,并简单地用ruby命令启动它。问题是我分批获取数据,处理这些数据可能需要几分钟的时间

当我部署一个新版本时,我想引入一个软重启,这意味着应用程序将首先通知新部署:这样它就可以完成批处理,然后说“我准备好更新了”(部署脚本将等待该消息)


有什么宝石吗?也许Capistrano包含该选项?

允许应用程序捕获POSIX信号。请看下面的图片

如果向进程发送
kill
,则无论进程当前在做什么,都将调用任何信号处理程序。例如,您可以设置某种标志,在逻辑中的某个合理点(例如,在运行循环结束时)检查该标志,如果设置了该标志,则终止进程。您可以对这些信号做出响应,但是
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

您需要更具体地了解应用程序。例如,使用Unicorn运行机架应用程序(Rails、Sinatra、Padrino等),您只需向Unicorn主进程发送s USR2信号,它将启动一个新的Unicorn进程,而不会终止旧进程,将旧的PID文件写入磁盘,然后,当新的工作进程启动时,向旧的工作进程发送一个QUIT(从旧的PID文件)。。。一辞职,老工人就在完成加工后关门大吉。你的问题太模糊,没有上下文;)好的,我要补充一点:它基本上是一个普通的Ruby应用程序(根本不是web应用程序),在服务器上,我只需用一个“Ruby app.rb”启动它