2013-08-28 57 views
1

我用Ruby 1.8.7寫一個守護進程(即沒有Process.daemon)採用雙叉+ setsid:守護進程仍然可以打印到stdout?

exit if fork 
Process.setsid 
exit if fork 

這一切後,我還是出於某種原因,似乎能夠打印出標準輸出。從我讀過的所有內容來看,守護進程不應該有控制終端,寫入stdout不應該做任何事情。但是,如果我按照上面的步驟操作:

puts "Hello world" 

「Hello world」被打印到屏幕上。這是預期的行爲?

回答

0

是的我相信這是預期的。調用Process.setsid不關閉所有打開的文件描述符,你將需要/dev/null手動重新打開它們,例如:

io = File.open("/dev/null", "w+") 

exit if fork 
Process.setsid 
exit if fork 

$stdin.reopen(io) 
$stdout.reopen(io) 
$stderr.reopen(io) 

或者,如果你關心的輸出,你可以重新打開輸出和錯誤使用日誌文件。

我也建議改變工作目錄/以避免在一個不存在的目錄中運行進程:

Dir.chdir("/")