Взято из этого: 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.

В чем дело, если дочерний процесс становится сиротой? Зачем ему нужен его собственный сид?

1 ответ1

1

* Процессы Nix идентифицируются с помощью PID (идентификатор процесса), PPID (идентификатор родителя), GID (идентификатор группы) и SID (идентификатор сеанса). Вы можете увидеть их с помощью команды

 ps  xao pid,ppid,pgid,sid,comm

(это включает поле command , то есть команду, которая дала начало процессу).

PID и PPID легко понять; GID используется для разрешения прерывания для всех процессов, принадлежащих к одной группе: предположим, что вы делаете

find / -type f -name '*.pdf' | sort | less

и вы хотите suspend эту команду (Ctrl+Z), вам нужно приостановить все из них; для этого они принадлежат одному и тому же GID, и прерывание доставляется всем процессам с одинаковым GID.

SID (идентификатор сеанса) - это идентификатор процесса, который создает сеанс. Все процессы, созданные позднее в том же сеансе, наследуют этот SID, хотя они могут иметь разные идентификаторы групп и PPID, и они, безусловно, имеют разные идентификаторы PID.

Когда рассматриваемый сеанс завершается (например, через выход из системы), ядро убивает все процессы с одним и тем же идентификатором безопасности, принадлежащим данному сеансу. Это сделано по очевидным причинам: оставшиеся процессы ожидают ввода, который больше не может поступить, или будут доставлять выходные данные или сообщения об ошибках, на которые никто не будет смотреть.

Чтобы служба (в моем предыдущем ответе не учитывалось, что вы обсуждаете именно службу, извините за мою рассеянность) переживет выход из сеанса, который ее начал, ее нельзя оставить с идентификатором SID оригинала. сеанс, чтобы ядро не отключилось при выходе из системы. Отсюда необходимость нового SID. Если вы не назначите ему новый SID, он унаследует тот сеанс, который его запускает, и будет уничтожен при каждом закрытии сеанса, что, скорее всего, будет намного короче, чем срок службы службы.

На странице, которую вы упомянули выше, есть еще один стандартный (но все же симпатичный) поворот: fork . Это также является частью стратегии для демона, чтобы пережить исчезновение его исходной среды. Вы, вероятно, заметили, что демон сначала разветвляется от своего родительского процесса, а затем сразу же закрывает родительский процесс перед началом работы. Зачем? Потому что, когда терминал закрыт, он отправляет сигнал SIGHUP своему управляющему процессу, оболочке. Обычно это приводит к смерти всех процессов, подключенных к этой оболочке, так как оболочка будет повторно передавать сигнал SIGHUP, полученный им, на все его задания.Но оболочка не отслеживает своих внуков, поэтому демон выживает после закрытия терминала, из которого он происходит.

Отключение демона от Сессии и от терминала важно для его выживания, как только один из них исчезнет.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .