O ID pai do processo órfão não é 1 quando o processo pai é executado a partir do Terminal do GNOME

4

Eu inicio um novo processo a partir do Terminal GNOME e, em seguida, este processo bifurca um filho. Mas quando eu matei o processo pai, o ID pai do processo órfão se tornou algo diferente de 1, que representa init --user pid.
Quando faço isso em terminais virtuais, o pid pai é 1, o que representa init process.
Como posso executar um novo processo a partir do Terminal do GNOME para que, quando ele estiver morto, o pai pai do processo filho se torne 1 e não o pid de init --user process?
Muito obrigado.

    
por user2142353456 03.04.2015 / 12:22

1 resposta

7

Já respondi uma pergunta semelhante há alguns meses. Então, veja isso primeiro para detalhes técnicos. Aqui, mostrarei a você como sua situação é coberta por essa resposta.

Como eu expliquei, eu e outros escritores de vários utilitários de supervisão do daemon aproveitam como o Linux agora funciona, e o que você está vendo é exatamente isso em ação, quase exatamente como eu coloquei .

A única informação que falta é que init --user é sua instância da sessão de upstart. Ele é iniciado quando você faz login pela primeira vez em uma sessão e para quando você faz logout. Está lá para você ter trabalhos por sessão (similares, mas não idênticos, aos agentes do usuário do MacOS 10 sob launchd ).

Um par de anos atrás, o pessoal do Ubuntu passou a converter sistemas de desktop gráficos para empregar trabalhos iniciados por sessão. Seu Terminal GNOME está sendo iniciado como um trabalho por sessão, e todos os filhos órfãos são herdados pelo sub-reaper mais próximo, que é obviamente sua instância por sessão de upstart.

O pessoal do sistema tem, nos últimos meses, trabalhado exatamente na mesma coisa, configurando o GNOME Terminal para executar guias individuais como serviços systemd separados, a partir de uma instância por usuário do systemd. (Você pode dizer que sua pergunta é sobre upstart, não systemd, porque em um sistema systemd o processo sub-reaper seria systemd --user .)

How can I execute a new process from GNOME Terminal so that the child process's parent PID becomes 1 and not the PID of the ubuntu session init process?

Isso é intencionalmente difícil. Os gerentes de serviço querem acompanhar os processos filhos órfãos. Eles querem que não os percam para processar # 1. Portanto, o resumo rápido é: pare de tentar fazer isso.

Se você está perguntando apenas porque acha que seu processo deve ter um ID de processo pai de 1, desista dessa ideia.

Se você pensa erroneamente que este é um aspecto de ser daemon, então note que daemons tendo IDs de processo pai de 1 não foram garantidos (e em alguns Unices, não são verdadeiros em todo o sistema) desde o advento de coisas como O System Resource Controller da IBM e os daemontools de Bernstein nos anos 90. Em qualquer caso, não se pode ser um daemon por bifurcação dupla dentro de uma sessão de login. Essa é uma ideia há muito conhecida por ser meio cozida.

Se erroneamente achar que isso é um truísmo para processos filhos órfãos, leia a minha resposta anterior novamente. O absolutismo que as crianças órfãs são re-parentais para processar # 1 está errado, e tem sido errado por mais de três anos, no momento de escrever isso.

Se você tem um processo filho que por alguma razão bizarra realmente precisa disso, então descubra qual é a razão bizarra e conserte-a. É provavelmente um bug, ou alguém fazendo suposições de design inválidas. Seja qual for o motivo, o mundo do gerenciamento de dados mudou na década de 1990, e o Linux também mudou alguns anos atrás. É hora de recuperar o atraso.

Leitura adicional

por 03.04.2015 / 15:24