在 Ruby 中创建一个带有双叉的守护进程
在 Ruby 中创建行为良好的 Unix 或 Linux 守护进程的正确方法是什么?
行为良好的守护进程的定义是什么?以及如何在 Ruby 中编写这样的程序?
What is the proper way to create a well-behaved Unix or Linux daemon in Ruby?
What is the definition of a well-behaved daemon anyway, and how would one write such a program in Ruby?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
根据 Stevens 的UNIX 环境中的高级编程第 13 章,这是制作一个行为良好的 Unix 守护进程的过程:
setsid
创建新会话。这做了三件事:/
以避免干扰安装和卸载现在有一个文件可以跟踪 PID,Linux 发行版启动脚本大量使用该文件。一定要写出孙子的 PID,要么是第二个 fork 的返回值(第 3 步),要么是第 3 步之后 getpid() 的值。
这是一个 Ruby 实现,大部分翻译自书上的,但是使用了双叉并写出了守护进程 PID。
According to Stevens's Advanced Programming in the UNIX Environment chapter 13, this is the procedure to make a well-behaved Unix daemon:
setsid
to create a new session. This does three things:/
to avoid interfering with mounting and unmountingstdout
,stderr
, andstdin
.Nowadays there is a file to track the PID which is used heavily by Linux distribution boot scripts. Be sure to write out the PID of the grandchild, either the return value of the second fork (step 3) or the value of
getpid()
after step 3.Here is a Ruby implementation, mostly translated from the book, but with the double-fork and writing out the daemon PID.
继杰森的精彩回应之后,我在这里编写了更完整的实现:
https://gist.github.com/1372491 /b76b60fb1842bf0507f47869ab19ad50a045b214
除了双分叉和将 pid 写入文件之外,我还实现了日志记录。
另一个有趣的实现是在 Unicorn 中:
https://github.com/ defunkt/unicorn/blob/master/lib/unicorn/launcher.rb
Following on from Jason's awesome response I have written a fuller implementation here:
https://gist.github.com/1372491/b76b60fb1842bf0507f47869ab19ad50a045b214
I have implemented logging in addition to the double fork and writing of the pid to file.
Another interesting implementation is in Unicorn:
https://github.com/defunkt/unicorn/blob/master/lib/unicorn/launcher.rb