- 論壇徽章:
- 0
|
# File lib/webrick/server.rb, line 28- def Daemon.start
- exit!(0) if fork # 1
- Process::setsid # 2
- exit!(0) if fork # 3
- Dir::chdir("/") # 4
- File::umask(0) # 5
- STDIN.reopen("/dev/null") # 6
- STDOUT.reopen("/dev/null", "w") # 7
- STDERR.reopen("/dev/null", "w") # 8
- yield if block_given? # 9
- end
復(fù)制代碼 # 1: 產(chǎn)生一次fork,并且父進(jìn)程退出(parent pid為true)
# 2:執(zhí)行setsid,將子進(jìn)程設(shè)置為新的進(jìn)程領(lǐng)導(dǎo)
# 3:接著子進(jìn)程再fork一次,并且子進(jìn)程退出,子子進(jìn)程留下來(lái)
# 4:改變執(zhí)行家目錄
# 5:設(shè)置文件目錄掩碼
# 6-7-8:重定向輸入輸出到/dev/null
# 9:執(zhí)行傳入的block
關(guān)鍵技巧是這里fork了兩次。
很多daemon程序,如nagios,都這么做的。
目的是為了徹底擺脫僵尸進(jìn)程。 |
|