2009-11-16 38 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