新手问题 纯 ruby 代码常驻进程怎么写的,daemon 这个 gem 好久没动了

as181920 · 2014年06月06日 · 最后由 as181920 回复于 2015年02月02日 · 4466 次阅读

如题,纯 ruby 代码,监听队列,常驻进程,一般怎么写的?

,,,诶哟。同问...我也想知道

想想有什么 gem 是常驻内存的,然后看它源码怎么写。

你可以参考一下 peatio

foreman 可参考

ruby.19 有 Process.daemon 方法设置守护进程,常驻用 io loop 可以参照 https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/cli.rb 的 run 和 daemon 方法。

另外常驻进程可以参考https://practicingruby.com/articles/event-loops-demystified,不过不建议自己写常驻进程,容灾太弱,稍不注意就死了

别想太多

while 1 do
   ...
   t = Thread.new
   ...
   sleep n
end
  • 按你的服务器能力控制下 Thread 的数量
  • 进程用 god 管上
  • 输出日志下

队列客户端用,暂时先 Process.daemon 了,修改重启就直接系统 kill 咯。

健壮性暂时需求不高,可以重启,可以加 begin/rescue,最后不行上监控。

做个 daemon

#8 楼 @mars 怎么做,参考上面提到的哪几个源码?

Daemon 这个 Gem 很久没有动了,但是不代表不能用呀。因为 Ruby 的 Process Module 非常稳定,版本几乎无变化,所以配合 Daemons 一直工作的很好。

一个 Loop 就能常驻内存,但是要管理一个 Loop 进程,比如检查,监控,重启,关闭,就要写很多管理代码,Daemons 就是帮你解决这些问题的,放心大胆的用吧。

常驻内存一定要做到监控,一个是 god 监控保持开启,一个是把 god 系统服务化保证重启机器后服务都起来了。然后真正的执行脚本反而可以简单一些,普通 loop 就 OK 了。

看过《理解 UNIX 进程》那本书,要做常驻内存的守护进程,需要做两次 fork,要脱离 session group 和 parent group,这样就不会在父进程退出和 session 退出的时候被杀掉。

while true + crontab算么

#10 楼 @lgn21st 是滴,其实也一直在用,倒是挺好用的,也没什么问题和额外的需求(除了监控)

#12 楼 @jimrokliu 这个去了解了,暂时不想自己写一套(懒,似乎也就几十行哈,细节有些不同实现,停止和重启等)

#11 楼 @linjunhalida god 似乎自己也可以将监控的东西 daemonize,下个脚本去用,之前没需求都没怎么用过 god。

#13 楼 @dddd1919 最早就是死循环做的哈:)

多谢各位。

EM 怎么样

#9 楼 @as181920 我用的是 Daemon 这个 gem,或许还有其他更好的做法吧。

直接用 eye 了,用 monit 配置有点麻烦。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号