Зачем процессу демона нужен новый sid?

0

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

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

Federico Ponzi
источник
хорошо, существующий сеанс и связанная с ним среда, в которой он выполнялся, испаряются, что делает его неспособным нормально работать.
Frank Thomas
@FrankThomas Привет Фрэнк, спасибо за комментарий. Не могли бы вы быть более ясным? Что вы имеете в виду под связанной средой? Что произойдет, если я оставлю процесс демона сиротой? Я знал, что процесс init позаботится о childs без ppid
Federico Ponzi
каждый процесс создается пользователем, наследует среду этого пользователя (например, ~ для процесса под user1 указывает на дом user1, но для user2 указывает на дом user2) и права доступа. дочерний процесс берет на себя пользователя своего родителя. как процесс получает доступ к папке, если с этим процессом больше не связан пользователь? Это проблема.
Frank Thomas

Ответы:

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, который она получила, на все свои задания. Но оболочка не отслеживает его внучата следовательно, демон переживает закрытие терминала, из которого он происходит.

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

MariusMatutiae
источник
Привет Мариус, так почему же при создании демона ему нужен новый sid? Спасибо за ответ
Federico Ponzi
@FedericoPonzi, на практическом уровне вы разбиваете процесс на обработку нового действия, поэтому в зависимости от того, как написан демон, каждый процесс представляет собой параллельную операцию демона, будь то сеанс пользователя, атомарный поток запросов / ответов, или набор параллельных рабочих процессов. Любой данный демон может обслуживаться несколькими процессами, но необходимо тщательно манипулировать отношениями родительских и дочерних процессов этих процессов, чтобы гарантировать, что у каждого процесса есть исполняющая среда, родитель и т. Д. Для параллельных операций даже иногда выгодно иметь отдельные среды ,
Frank Thomas