25
A
回答
50
根据UNIX环境第13章史蒂文斯的高级编程,这是做一个乖巧的Unix守护程序:
- 叉,并有家长退出。这使得shell或启动脚本认为命令已完成。此外,子进程保证不成为进程组领导者(接下来是setsid的前提条件)
- 请致电
setsid
创建新会话。这做了三两件事:- 过程将成为新的会话
- 的过程成为一个新的进程的进程组组长
- 过程没有控制终端的会话组长
- 或者再次分叉并有父级退出。这guarantes守护进程不是会话组长也不能获得控制终端(下SVR4)
- 改变当前工作目录
/
,以避免与安装和卸载 - 设置文件模式创建掩码000允许干扰稍后创建具有任何所需权限的文件。
- 关闭从父级继承的不需要的文件描述符(无论如何都没有控制终端):
stdout
,stderr
和stdin
。
现在有一个文件来跟踪Linux分发引导脚本严重使用的PID。请确保写出孙子的PID,第二个分支的返回值(第3步)或getpid()
在第3步后的值。
这是一个Ruby实现,主要是从书中翻译的,但是与双叉并写出守护进程PID。
# Example double-forking Unix daemon initializer.
raise 'Must run as root' if Process.euid != 0
raise 'First fork failed' if (pid = fork) == -1
exit unless pid.nil?
Process.setsid
raise 'Second fork failed' if (pid = fork) == -1
exit unless pid.nil?
puts "Daemon pid: #{Process.pid}" # Or save it somewhere, etc.
Dir.chdir '/'
File.umask 0000
STDIN.reopen '/dev/null'
STDOUT.reopen '/dev/null', 'a'
STDERR.reopen STDOUT
6
从杰森的真棒响应继我在这里写了一个更全面的实现:
https://gist.github.com/1372491/b76b60fb1842bf0507f47869ab19ad50a045b214
我已经在除了以文件的PID的双叉和写作来实现记录。
另一个有趣的实施是在麒麟:
https://github.com/defunkt/unicorn/blob/master/lib/unicorn/launcher.rb
相关问题
- 1. 守护进程创建不能使用Win32Utils ruby gem
- 2. Ruby守护进程Gem
- 3. 使Ruby程序成为守护进程?
- 4. 创建守护进程线程
- 5. Linux守护进程不分叉?
- 6. 非守护进程叉/连接池
- 7. 创建自定义Ubuntu守护进程
- 8. 使用python,守护进程
- 9. Ruby守护进程vs守护进程gem:有哪些优点和缺点?
- 10. Ruby守护进程和频率
- 11. 干净关机的Ruby守护进程
- 12. 动态Ruby守护进程管理
- 13. Ruby守护进程不会启动
- 14. 在MacOS X上创建运行守护进程的用户?
- 15. 如何在Centos中创建Java守护进程
- 16. 你如何在Python中创建一个守护进程?
- 17. 创建类似服务守护进程Android应用程序
- 18. 如何用erlang创建守护程序?
- 19. Linux守护进程
- 20. Python守护进程
- 21. iphone守护进程
- 22. 用Clojure/JVM守护进程
- 23. 在java中的守护进程线程
- 24. Linux守护进程停止启动 - 停止守护进程
- 25. Java中的守护进程和非守护线程优先级
- 26. 如何在Java中创建用户定义的守护进程线程?
- 27. 使用守护进程发送邮件
- 28. docker守护进程启动使用ansible
- 29. 值得使用守护进程吗?
- 30. 使用System_Daemon包的Codeigniter守护进程
或者使用http://daemons.rubyforge.org – ephemient 2009-11-16 15:38:12
这确实是一个很好的解释!非常感谢你回答你自己的问题。即使他们稍后找到了解决问题的办法,也不是每个人都这样做。 – t6d 2011-06-07 10:11:22
不客气!我很高兴能贡献。 – JasonSmith 2011-06-08 01:27:06