Снова открыть стандартный вывод для демона linux?
Я понимаю, что демон не должен писать stdout
(а также stderr
) потому что это не будет доступно после отсоединения от управляющего терминала. Но могу ли я снова открыть stdout
в обычный файл, чтобы все мои оригинальные журналы все еще работали? Это было бы очень приятно и полезно для меня.
Я пробовал что-то подобное после разветвления,
freopen("/dev/null/", "r", stdin);
freopen("log", "w", stdout);
freopen("log", "w", stderr);
BOOST_LOG_TRIVIAL(info) << "daemonized!";
Демон может быть запущен (если быть точным, он не выйдет из строя и выйдет), и файл журнала может быть создан. Но журнал пуст (без "демон!"). Разве это не правильный способ демонизации? Может ли кто-то пролить свет?
1 ответ
Есть функция библиотеки, daemon(int nochdir, int noclose)
, это доступно, чтобы помочь коду надлежащим образом демонизировать и дополнительно открыть стандартные потоки ввода / вывода, подключенные к /dev/null
, Используя это и средство системного журнала (как syslog
) я бы выбрал "правильный" способ демонизации.
Наличие стандартных потоков ввода-вывода, открытых и связанных с /dev/null
обеспечит преимущество, позволяющее избежать любых сбоев из-за любых перенесенных операций ввода-вывода с ними (которые могут, например, заблокировать процесс или вызвать неожиданный сигнал). Это дополнительно предотвратит непредвиденное получение любых новых дескрипторов и непреднамеренное получение результата от, скажем, перенесенного printf
заявления.
Что касается связывания стандартных потоков ввода-вывода с обычным файлом, то следующее предупреждение в Интернете daemonize
Справочная страница программы кажется полезной для распознавания:
Будьте осторожны, когда вы перенаправляете вывод! Файловая система, содержащая открытый файл, не может быть размонтирована, пока файл открыт. Для достижения наилучших результатов убедитесь, что этот выходной файл находится в той же файловой системе, что и рабочий каталог демона.