2013-08-28 4 views
1

Я пишу демон в Руби 1.8.7 (т.е. не Process.daemon) с использованием двойной вилка + setsid:Daemon все еще может печатать на stdout?

exit if fork 
Process.setsid 
exit if fork 

После всего этого, я до сих пор, по некоторым причинам, кажется, быть в состоянии распечатать на стандартный вывод. Из всего, что я прочитал, процесс демона не должен иметь управляющий терминал, и запись в stdout не должна делать ничего. Однако, если я продолжу вышеуказанное с:

puts "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("/") 
Смежные вопросы