Plano de fundo, zumbi, daemon e sem ctty - esses conceitos estão conectados?

7

Como esses conceitos de processo são relacionados juntos - background , zombie , daemon e 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á muita informação para eu contar uma história, como se você precisasse explicar algo a uma criança lendo um artigo sobre Linux sem mentindo muito.

UPDATE # 1: Por exemplo (não sei se isso é verdade)

  • background - zombie - o processo de primeiro plano não pode se tornar zombie , porque zombie é um processo em segundo plano que foi deixado sem um pai
  • daemon - without ctty - all daemons executado sem ctty , mas nem todos os processos sem ctty são daemons
  • background - daemon - a background process pode ser recuperado para executar interativamente novamente, daemon is not
  • zombie - without ctty - zombie é indiferente se houver ctty anexado ou não
  • background - without ctty - processes enviado para o segundo plano enquanto eles têm ctty , e se tornam daemons ou morrem se o ctty for tirado deles
por anatoly techtonik 21.03.2017 / 10:09

3 respostas

9

Em resumo, além de links.

zumbi

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

Veja:

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

Eles estão relacionados ao controle de tarefas no contexto de um shell executado 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 executa os processos e os envia no primeiro plano e no plano de fundo, conforme desejado pelo usuário (usando & ao iniciar o processo, parando-o com ^Z , usando fg e bg ). Os processos em segundo plano são interrompidos se forem lidos ou gravados no terminal; processos em primeiro plano recebem o sinal de interrupção se ^C for atingido 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.

Veja:

daemon

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

Como um daemon não possui um terminal de controle, ele não está sujeito a controle de tarefas e não está em primeiro plano ou plano de fundo. Além disso, os daemons geralmente re-parentam para init , que os limpa quando eles saem, então você não os vê como zumbis.

Veja:

por 21.03.2017 / 13:19
4

Zombie não está realmente relacionado com os outros; é simplesmente um processo que terminou, 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 cheio de bugs ou esteja parado.

Um daemon é um programa que roda sem um terminal de controle. Normalmente, quando você executa o programa, ele fork()s em si e o pai sai 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 que o processo pai foi encerrado, seu ID de processo pai se torna 1, que é tradicionalmente o programa init , ou atualmente, systemd . Este processo garante a colheita dos seus filhos quando eles morrem, para que você não acabe invadido por zumbis.

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

O shell cria grupos de processos diferentes para cada um dos comandos de pipeline que você solicita que ele execute e desloca qual deles é o grupo de primeiro plano para mover trabalhos entre o primeiro plano e o segundo plano. Quando você executa um comando, normalmente o shell cria um novo grupo de processos e faz desse grupo o grupo de primeiro plano . Se você sufixá-lo com um & , o shell simplesmente deixará o grupo em primeiro plano onde estava e, portanto, o novo grupo estará em segundo plano. Pressionar Ctrl-Z envia SIGSUSP para o 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 para si mesmo para poder solicitar um novo comando.

O comando bg envia o SIGCONT para um grupo de processos para que ele possa voltar a ser executado em segundo plano após ter sido suspenso com o SIGSUSP. fg altera o grupo em primeiro plano para um dos grupos existentes já em execução em segundo plano, trazendo-o para o primeiro plano.

    
por 21.03.2017 / 16:03
4

Ok, aqui está minha explicação com ênfase nas diferenças entre esses tipos de processos (curtos e informativos):

  • zombie - processo que acabou de sair (terminou sua execução) mas ainda tem uma entrada em uma tabela de processos. Nota : zumbi processo ainda tem um pai e geralmente o ponto de sua existência é deixar que o processo pai saiba sobre o resultado da execução da criança (código de saída, etc.).
  • disowned process (sem terminal de controle) - processo que foi explicitamente disown 'ed por usuário ou projetado para ser desanexado de uma árvore de processos pai. Ele ainda seria executado mesmo se o processo pai terminasse a execução. Por exemplo, o usuário ssh 'para uma máquina remota, iniciou algo como um servidor da Web, depois executou disown e saiu da ssh session. O processo ainda estaria sendo executado, já que não é mais parte de uma árvore de processos pai. O processo também pode ser deserdado executando-o com nohup .
  • background process - é executado em segundo plano - não divide a saída no tty de um usuário. Ou foi executado com & no final ou se bifurcou em um plano de fundo por design. Outra opção para enviar um processo para um plano de fundo é iniciá-lo e pressionar ctrl+z . No entanto, quando o processo pai for finalizado, o filho em segundo plano também terminará ( note por @psusi - o fato prévio só é verdadeiro com processos iniciados de um terminal pelo usuário; caso contrário, o processo filho se torna um 'orphant' e obtém um processo init (pid 1) como pai / mãe.
    • daemon - muito semelhante ao processo em segundo plano. Também é executado em segundo plano, mas provavelmente foi forjado implicitamente (por design). Normalmente ele fica quieto em um fundo esperando que alguns até ocorram e só então faz um trabalho real (conexão de entrada etc). Na verdade, o daemon pode ser o processo deserdado (mais provavelmente) e plano de fundo dependendo do design.

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

    
por 21.03.2017 / 10:30