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. OS X雙叉 - 守護進程腳本
- 2. 守護進程創建不能使用Win32Utils ruby gem
- 3. Ruby守護進程決定
- 4. Ruby守護進程Gem
- 5. 使Ruby程序成爲守護進程?
- 6. 創建守護進程線程
- 7. 創建自定義Ubuntu守護進程
- 8. fork創建守護進程失敗
- 9. Linux守護進程不分叉?
- 10. 非守護進程叉/連接池
- 11. 在守護進程線程中創建的進程的主線程是守護進程本身嗎?
- 12. 使用python,守護進程
- 13. Ruby守護進程vs守護進程gem:有哪些優點和缺點?
- 14. Ruby守護進程和頻率
- 15. 乾淨關機的Ruby守護進程
- 16. Ruby守護進程不工作
- 17. 動態Ruby守護進程管理
- 18. Ruby守護進程和bluepill監控
- 19. Ruby守護進程不會啓動
- 20. 在MacOS X上創建運行守護進程的用戶?
- 21. 你如何在Python中創建一個守護進程?
- 22. 如何在Centos中創建Java守護進程
- 23. 創建類似服務守護進程Android應用程序
- 24. Linux守護進程
- 25. iphone守護進程
- 26. Python守護進程
- 27. 如何用erlang創建守護程序?
- 28. 用Clojure/JVM守護進程
- 29. python守護進程的單個實例(使用python守護進程)
- 30. 在java中的守護進程線程
或者使用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