如题,纯 ruby 代码,监听队列,常驻进程,一般怎么写的?
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
队列客户端用,暂时先 Process.daemon 了,修改重启就直接系统 kill 咯。
健壮性暂时需求不高,可以重启,可以加 begin/rescue,最后不行上监控。
Daemon 这个 Gem 很久没有动了,但是不代表不能用呀。因为 Ruby 的 Process Module 非常稳定,版本几乎无变化,所以配合 Daemons 一直工作的很好。
一个 Loop 就能常驻内存,但是要管理一个 Loop 进程,比如检查,监控,重启,关闭,就要写很多管理代码,Daemons 就是帮你解决这些问题的,放心大胆的用吧。
常驻内存一定要做到监控,一个是 god 监控保持开启,一个是把 god 系统服务化保证重启机器后服务都起来了。然后真正的执行脚本反而可以简单一些,普通 loop 就 OK 了。
看过《理解 UNIX 进程》那本书,要做常驻内存的守护进程,需要做两次 fork,要脱离 session group 和 parent group,这样就不会在父进程退出和 session 退出的时候被杀掉。
#10 楼 @lgn21st 是滴,其实也一直在用,倒是挺好用的,也没什么问题和额外的需求(除了监控)
#12 楼 @jimrokliu 这个去了解了,暂时不想自己写一套(懒,似乎也就几十行哈,细节有些不同实现,停止和重启等)
#11 楼 @linjunhalida god 似乎自己也可以将监控的东西 daemonize,下个脚本去用,之前没需求都没怎么用过 god。
多谢各位。