Por que um processo Deamon precisa de um novo sid?

0

Retirado deste: 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.

Qual é o problema se o processo filho se tornar órfão? Por que ele precisa de seu próprio sid?

Federico Ponzi
fonte
bem, a sessão existente e o ambiente associado sob o qual ele estava executando desapareceriam, deixando-o incapaz de executar corretamente.
22416 Frank Thomas
@FrankThomas Oi Frank, obrigado pelo comentário. Poderia, por favor, ser mais claro? O que você quer dizer com ambiente associado? O que acontece se eu deixar um processo de devoção como órfão? Eu sabia que o processo init que tomar cuidado com criança sem um ppid
Federico Ponzi
todo processo é criado por um usuário, herda o ambiente do usuário (por exemplo, ~ para um processo no usuário1 aponta para a casa do usuário1, mas para o usuário2 aponta para a casa do usuário2) e direitos de acesso. um processo filho assume o usuário de seu pai. como um processo acessa uma pasta se esse processo não tem mais um usuário associado? Essa é a questão.
22816 Frank Thomas

Respostas:

1

* Os processos Nix são identificados por um PID (ID do processo), um PPID (PID dos pais), um GID (ID do grupo) e um SID (ID da sessão). Você pode vê-los com o comando

 ps  xao pid,ppid,pgid,sid,comm

(isso inclui o commandcampo, ou seja , o comando que deu origem ao processo).

PID e PPID são fáceis de entender; o GID é usado para permitir que uma interrupção alcance todos os processos pertencentes ao mesmo grupo: suponha que você esteja fazendo

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

e você deseja suspendeste comando ( Ctrl+ Z), precisará suspender todos eles; para permitir isso, eles pertencem ao mesmo GID e a interrupção é entregue a todos os processos com o mesmo GID.

O SID (ID da sessão) é o PID do processo que cria uma sessão. Todos os processos criados posteriormente na mesma sessão herdam esse SID, embora possam ter IDs de grupo e PPIDs distintos, e certamente possuem PIDs distintos.

Quando a sessão em questão termina (por exemplo, através de um logout), o kernel mata todos os processos com o mesmo SID, pertencentes à sessão em questão. Isso é feito por razões óbvias: os processos restantes estariam aguardando entrada que não pode mais chegar, ou estariam entregando mensagens de saída ou erro que ninguém examinará.

Para que um serviço (minha resposta anterior não levasse em conta que você está discutindo exatamente um serviço, desculpe-me por minha distraída) sobreviver ao logout da sessão que o iniciou, ele não pode ser deixado com o SID do original sessão, para que não seja destruído pelo kernel no logout. Daí a necessidade de um novo SID. Se você não atribuir um novo SID, ele herdará o da sessão que o executa e será eliminado sempre que a sessão for fechada, o que provavelmente é muito menor do que o tempo em que você deseja que um serviço dure.

Há outra reviravolta padrão (mas ainda assim fofa) na página que você mencionou acima: a fork. Isso também faz parte da estratégia para o daemon sobreviver ao desaparecimento de seu ambiente de origem. Você provavelmente notou que o daemon primeiro extrai do processo pai e, em seguida, fecha imediatamente o processo pai antes de começar a trabalhar. Por quê? Porque, quando um terminal é fechado, ele envia um sinal SIGHUP para seu processo de controle, o shell. Isto faz com que todo o processo geralmente ligado a esta concha de morrer, como a concha vai retransmitir o SIGHUP recebeu a toda a sua jobs.But o escudo não manter o controle dos seus netos , portanto, o daemon sobrevive ao fechamento do terminal a partir do qual se origina .

Desconectar o daemon da sessão e do terminal é essencial para sua sobrevivência, uma vez que um deles desaparece.

MariusMatutiae
fonte
Olá Marius, por que, ao criar um daemon, ele precisa de um novo sid? Obrigado pela resposta
Federico Ponzi 13/16
@FedericoPonzi, em um nível prático, você bifurca um processo para lidar com uma nova atividade; portanto, dependendo de como o daemon é gravado, cada processo representa uma operação paralela do daemon, seja uma sessão do usuário, um fluxo atômico de solicitação / resposta, ou um conjunto de processos de trabalho paralelos. Qualquer daemon pode ser atendido por vários processos, mas o relacionamento pai-filho desses processos precisa ser cuidadosamente manipulado para garantir que cada processo tenha um ambiente de execução, um pai, etc. Para operações paralelas, às vezes é vantajoso ter ambientes separados .
Frank Thomas