Взятые из этого: http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html#ss4.4
From here, the child process must get a unique SID from the kernel in order to operate. Otherwise, the child process becomes an orphan in the system.
В чем дело, если дочерний процесс становится сиротой? Зачем ему нужен собственный сид?
Ответы:
* Процессы Nix идентифицируются с помощью PID (идентификатор процесса), PPID (идентификатор родителя), GID (идентификатор группы) и SID (идентификатор сеанса). Вы можете увидеть их с помощью команды
(это включает в себя
command
поле, то есть команда, которая дала начало процессу).PID и PPID легко понять; GID используется для разрешения прерывания для всех процессов, принадлежащих к одной группе
и ты хочешь
suspend
эта команда ( Ctrl + Z ) вам нужно будет приостановить их все; для этого они принадлежат одному и тому же GID, и прерывание доставляется всем процессам с одинаковым GID.SID (идентификатор сеанса) - это идентификатор процесса, который создает сеанс. Все процессы, созданные позже в том же сеансе, наследуют этот SID, хотя они могут иметь разные идентификаторы групп и PPID, и они, безусловно, имеют разные идентификаторы PID.
Когда рассматриваемый сеанс завершается (например, через выход из системы), ядро убивает все процессы с одним и тем же идентификатором безопасности, принадлежащим данному сеансу. Это сделано по очевидным причинам: оставшиеся процессы ожидают ввода, который больше не может поступить, или будут доставлять выходные данные или сообщения об ошибках, которые никто не будет просматривать.
Чтобы служба (мой предыдущий ответ не учитывал, что вы обсуждаете именно службу, извините за мою рассеянность), чтобы пережить выход из сеанса, который ее начал, ее нельзя оставить с идентификатором SID оригинала. сеанс, чтобы ядро не отключилось при выходе из системы. Отсюда необходимость нового SID. Если вы не назначите ему новый SID, он унаследует тот сеанс, который его запускает, и будет уничтожен при каждом закрытии сеанса, что, скорее всего, будет намного короче, чем срок службы службы.
На странице, которую вы упомянули выше, есть еще один стандартный (но все же симпатичный) поворот:
fork
, Это также является частью стратегии для демона, чтобы пережить исчезновение его исходной среды. Вы, наверное, заметили, что демон сначала разветвляется от своего родительского процесса, а затем сразу же закрывает родительский процесс перед началом работы. Зачем? Потому что, когда терминал закрыт, он отправляет сигнал SIGHUP своему управляющему процессу, оболочке. Это обычно приводит к тому, что все процессы, подключенные к этой оболочке, умирают, так как оболочка будет повторно передавать SIGHUP, который она получила, на все свои задания. Но оболочка не отслеживает его внучата следовательно, демон переживает закрытие терминала, из которого он происходит.Отключение демона от Сессии и от терминала важно для его выживания, как только один из них исчезнет.
источник