Antecedentes, zumbi, daemon e sem ctty - esses conceitos estão conectados?


8

Como esses conceitos de processo estão relacionados juntos - background, zombie, daemone without controlling terminal?

Eu sinto que eles estão de alguma forma próximos, especialmente através do conceito de controlling terminal, mas ainda não há muitas informações para contar uma história, como se você precisasse explicar algo para uma criança lendo um artigo sobre Linux sem mentir muito.

ATUALIZAÇÃO # 1: Por exemplo (não sei se isso é verdade)

  • background- zombie- o processo em primeiro plano não pode se tornar zombie, porque zombieé um processo em segundo plano que foi deixado sem um pai
  • daemon- without ctty- todos são daemonsexecutados sem ctty, mas nem todos os processos sem cttysãodaemons
  • background- daemon- a background processpode ser recuperado para executar interativamente novamente,daemon is not
  • zombie- without ctty- zombieé indiferente se houver um cttyanexo ou não
  • background- without ctty- processesenviados para segundo plano enquanto estão ctty, e se tornam daemons ou morrem se cttylhes forem tirados.

Um processo em primeiro plano pode certamente ser um zumbi, embora geralmente não seja por um período considerável de tempo - a maneira usual de um shell (ou outro programa) executar um subprocesso em primeiro plano é fork()tirar uma cópia de si mesmo, use exec()nessa cópia para substituí-lo pelo que você deseja executar e use wait()na instância original do programa (não na cópia executada exec()). No período muito curto de tempo entre o momento em que a criança sai e o momento em wait()que colhe o status (removendo-o da tabela de processos e devolvendo-o ao chamador), você tem um zumbi.
Charles Duffy

@CharlesDuffy é possível enviar o pai para o segundo plano enquanto deixa o filho em execução em primeiro plano?
Anatoly techtonik

No controle típico do trabalho, a casca nem sequer sabe que o neto é separado do filho direto; está apenas esperando o filho sair, e se o filho está esperando o neto sair, bem, isso é assunto da criança. O que quer dizer - da perspectiva da concha que gerou o pai, trata-se apenas de uma unidade.
Charles Duffy

Respostas:


10

Em resumo, além de links.

zumbi

um processo que foi encerrado / finalizado, mas cujo pai ainda não reconheceu a finalização (usando as wait()chamadas do sistema). Os processos inativos são mantidos na tabela de processos para que seus pais possam ser informados de que seus filhos estão saindo do processo filho e de seu status de saída. Normalmente, um programa que bifurca crianças também lê seu status de saída quando saem, portanto, você verá zumbis apenas se o pai estiver parado ou com bugs.

Vejo:

terminal de controle, sessão, primeiro plano, plano de fundo

Eles estão relacionados ao controle de tarefas no contexto de um shell em execução em um terminal. Um usuário efetua login, uma sessão é iniciada, vinculada a um terminal (o terminal de controle) e um shell é iniciado. O shell então executa processos e os envia em primeiro plano e em segundo plano conforme o usuário desejar (usando &ao iniciar o processo, parando-o com ^Z, usando fge bg). Os processos em segundo plano são interrompidos se a leitura ou gravação do terminal; processos em primeiro plano recebem o sinal de interrupção se ^Cforem atingidos no terminal. (É o driver de terminal do kernel que lida com esses sinais, o shell controla qual processo (grupo) é enviado para o primeiro ou segundo plano.

Vejo:

daemon

Um processo em execução como um daemon geralmente é algo que não deve estar vinculado a nenhum terminal específico (ou uma sessão de login ou um shell). Ele não deve ter um terminal de controle, para que não receba sinais se o terminal fechar, e geralmente não se deseja que ele faça E / S em um terminal. Iniciar um daemon a partir da linha de comando requer quebrar todos os vínculos com o terminal, ou seja, iniciar uma nova sessão (no sentido de controle da tarefa, acima) para se livrar do terminal de controle e fechar as alças de arquivo no terminal. É claro que algo iniciado init, systemd ou similar fora de uma sessão de login, não teria esses vínculos para começar.

Como um daemon não possui um terminal de controle, ele não está sujeito ao controle de tarefas, e o fato de estar em "primeiro plano" ou "plano de fundo" no sentido de controle de tarefas não se aplica. Além disso, os daemons geralmente são re-pais, o initque os limpa quando eles saem, para que você não os veja como zumbis.

Vejo:


4

Zumbi não é realmente relacionado aos outros; simplesmente é um processo que foi finalizado, mas seu processo pai ainda não leu seu status de saída com waitpid()ou similar. Você não deve vê-los, a menos que um processo esteja com erros ou parado.

Um daemon é um programa que é executado sem um terminal de controle. Normalmente, quando você executa o programa, ele fork()spróprio e o pai saem para que o shell pense que o comando foi concluído e o processo filho se desconecta do terminal e escapa da sessão de login. Desde a saída do processo pai, seu ID do processo pai se torna 1, que é tradicionalmente o initprograma ou atualmente systemd. Esse processo garante a colheita de seus filhos quando eles morrem, para que você não seja invadido por zumbis.

Um processo pode ser associado a um terminal de controle , de onde ele normalmente recebe sua entrada e a envia para. O terminal também pode enviar sinais para processos conectados a ele e identifica um grupo de processos como o grupo em primeiro plano . Os processos que estão no grupo em primeiro plano têm permissão para ler as entradas do terminal e recebem os sinais SIGINT e SIGSUSP quando você pressiona Ctrl-C e Ctrl-Z. Qualquer processo que não esteja no grupo de primeiro plano que tenta ler do terminal é suspenso com o SIGTSTP.

O shell cria grupos de processos diferentes para cada um dos comandos de pipeline que você pede para executar, e muda qual deles é o grupo em primeiro plano para mover tarefas entre o primeiro e o segundo plano. Quando você executa um comando, normalmente o shell cria um novo grupo de processos e o grupo em primeiro plano . Se você o sufixar com um &, o shell simplesmente deixará o grupo em primeiro plano onde estava e, portanto, o novo grupo ficará em segundo plano. Pressionar Ctrl-Z envia SIGSUSP ao grupo em primeiro plano, o que faz com que a maioria dos comandos seja suspensa, mas, em vez de suspender, o shell altera o grupo em primeiro plano ativo novamente para que ele possa solicitar um novo comando.

O bgcomando envia o SIGCONT a um grupo de processos para que ele possa retomar a execução em segundo plano após ter sido suspenso com o SIGSUSP. fgaltera o grupo em primeiro plano para um dos grupos existentes já em execução em segundo plano, trazendo-o para o primeiro plano.


4

Ok, aqui está minha explicação, enfatizando as diferenças entre esses tipos de processos (curtos, mas informativos):

  • zombie- processo que acabou de sair (terminou sua execução), mas ainda tem uma entrada em uma tabela de processos. Nota : o processo zumbi ainda tem um pai e geralmente o ponto principal de sua existência é permitir que esse processo pai saiba sobre o resultado da execução do filho (código de saída etc.).
  • disowned process(sem terminal de controle) - processo explicitamente disowneditado pelo usuário ou projetado para ser desanexado de uma árvore de processos pai. Ele ainda seria executado mesmo se o processo pai concluir a execução. Por exemplo, o usuário sshfoi para uma máquina remota, iniciou algo como um servidor da Web, depois executou disownnela e saiu da sshsessão. O processo ainda estaria em execução, pois não faz mais parte de uma árvore de processos pai. O processo também pode ser renegado ao executá-lo nohup.
  • background process- roda em segundo plano - não divide a saída no tty de um usuário. Ou foi executado &no final, ou se bifurcou em um plano de fundo por design. Outra opção para enviar um processo para segundo plano é iniciá-lo e pressionar ctrl+z. No entanto, quando o processo pai será encerrado, o filho em execução em segundo plano também será encerrado ( observação por @psusi - o fato anterior é verdadeiro apenas com processos iniciados a partir de um terminal pelo usuário; caso contrário, o processo filho se torna um 'orfandade' e recebe uma processo init (pid 1) como pai).
    • daemon- muito parecido com o processo em segundo plano. Também é executado em segundo plano, mas provavelmente foi bifurcado implicitamente (por design). Normalmente, ele fica silenciosamente em segundo plano, à espera de que ocorram algumas coisas e só então faz um trabalho real (conexão de entrada etc.). Na verdade, o daemon pode ser renegado (provavelmente) e o processo em segundo plano , dependendo do design.

Espero que esta explicação ajude a distinguir esses tipos de processos.


Agradável. A tabela de processo pertence ao pai? Então os zumbis morrem sem o seu mestre?
techtonik anatoly

Tabela não é a palavra certa. É um processo tree. Sim, claro, o pai não pode terminar após o término do filho (mas pode fazê-lo se estiver aguardando que um filho termine o processamento de algum tipo de material). Mas se os pais terminassem - o filho terminaria definitivamente. Você pode correr topdo seu terminal e pressionar shift-vpara ver as árvores de processo em estado selvagem.
precisa saber é o seguinte

1
Um pai que termina o processo não mata seus filhos. Os filhos órfãos têm seu ID do processo pai alterado para init (1).
21417 psusi

@psusi você está certo, esqueci que é assim apenas com processos iniciados no terminal. Eu vou corrigir minha resposta.
precisa saber é o seguinte

Gostaria apenas de remover a frase "desapareceria da mesa em breve". Ele sugere que, de alguma forma, desaparece automaticamente após algum tempo, mas esse não é o caso; o "desaparecimento" é um evento muito concreto.
AnoE 21/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.