2009-11-16 69 views

回答

50

根据UNIX环境第13章史蒂文斯的高级编程,这是做一个乖巧的Unix守护程序:

  1. 叉,并有家长退出。这使得shell或启动脚本认为命令已完成。此外,子进程保证不成为进程组领导者(接下来是setsid的前提条件)
  2. 请致电setsid创建新会话。这做了三两件事:
    1. 过程将成为新的会话
    2. 的过程成为一个新的进程的进程组组长
    3. 过程没有控制终端的会话组长
  3. 或者再次分叉并有父级退出。这guarantes守护进程不是会话组长也不能获得控制终端(下SVR4)
  4. 改变当前工作目录/,以避免与安装和卸载
  5. 设置文件模式创建掩码000允许干扰稍后创建具有任何所需权限的文件。
  6. 关闭从父级继承的不需要的文件描述符(无论如何都没有控制终端):stdoutstderrstdin

现在有一个文件来跟踪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 
+4

或者使用http://daemons.rubyforge.org – ephemient 2009-11-16 15:38:12

+0

这确实是一个很好的解释!非常感谢你回答你自己的问题。即使他们稍后找到了解决问题的办法,也不是每个人都这样做。 – t6d 2011-06-07 10:11:22

+0

不客气!我很高兴能贡献。 – JasonSmith 2011-06-08 01:27:06