Почему демоны разветвляются? - PullRequest
17 голосов
/ 16 ноября 2010

Я знаю, что некоторые (все?) Ветки демонов запускаются.У меня сложилось впечатление, что это запускать дочерние процессы как менее привилегированные пользователи, особенно если демон является чем-то вроде HTTP-сервера.

Почему это необходимо?Не мог ли процесс запустить и отбросить свои привилегии, не разветвив дочерний процесс?Это «обязательно» для разветвления или есть какая-то другая особая причина (кроме для запуска нескольких дочерних рабочих процессов)?

Я новичок в этом и был бы признателен за любую помощь, которую я могу получить.*

Ответы [ 4 ]

19 голосов
/ 16 ноября 2010

Я думаю, что демоны разветвляются по нескольким причинам:

  1. Одной из причин является для отсоединения процесса от любой оболочки, которая его запускает . Некоторые оболочки (например, Bash) убивают детей при выходе, если только не предпринимаются особые меры предосторожности для конкретной оболочки. Форкинг - это общий способ избежать этого.

  2. Другая причина - , чтобы сообщить, что демон успешно запущен .

    Предположим, он не развивается. Как вы узнали, что демон успешно запущен? Вы не можете просто читать и анализировать выходные данные демона, потому что программы управления демонами должны делать это в общем виде. Таким образом, единственный способ - получить код возврата программы.

    Действительно, если демон не запустится (например, он не может найти файл конфигурации), вы сразу узнаете об этом. Но, эй, если демон успешно запущен, он может никогда не вернуться! Таким образом, ваш менеджер демонов не может знать, пытается ли демон все еще запускаться, или он уже запущен, и работает. Форк решит проблему, и программа разветвления вернет успех, если вилка будет работать хорошо.

  3. Что касается привилегий, отбрасывание их после execve намного менее безопасно, чем до execve. Вот еще одна причина, почему вилка удобна.

7 голосов
/ 16 ноября 2010

Демоны должны быть разветвлены два раза, потому что они должны быть независимы от других процессов, то есть нет способа убить демона, убивающего другой процесс, и должны работать в фоновом режиме, который не подключен к терминалу.

При запуске демон разветвляется, и родитель умирает.Это делает разветвленный процесс дочерним для init, поэтому в основном он независим от других процессов.

На втором ответвлении дочерний процесс больше не является лидером процесса и отсоединяется от терминала.

Могут применяться и другие полезные практики, чтение исходного кода простого демона может быть проницательным.

3 голосов
/ 16 ноября 2010

В подтверждение сказанного Дарамараком из статьи Википедии :

В среде Unix родительский процесс демона часто (но не всегда) процесс инициализации (PID = 1). Процессы обычно становятся демонами разветвление дочернего процесса, а затем имея свой родительский процесс немедленно выйти, вызывая init усыновить дочерний процесс. Это несколько упрощенный вид процесс, как и другие операции обычно выполняется, например, отделить процесс демона от любой контролирующий tty. удобство подпрограммы, такие как daemon (3), существуют в некоторые системы UNIX для этой цели.

По сути, процесс должен быть отделен от других процессов и от терминалов и тому подобного.

3 голосов
/ 16 ноября 2010

У меня сложилось впечатление, что это было сделано для того, чтобы демон полностью не был привязан к каким-либо другим процессам (например, к оболочке или аналогичным). При разветвлении и выходе из родительского процесса процесс Orphaned будет «принят» процессом init системы.

...