Como esses conceitos de processo estã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á 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 tornarzombie
, porquezombie
é um processo em segundo plano que foi deixado sem um paidaemon
-without ctty
- todos sãodaemons
executados semctty
, mas nem todos os processos semctty
sãodaemons
background
-daemon
- abackground process
pode ser recuperado para executar interativamente novamente,daemon is not
zombie
-without ctty
-zombie
é indiferente se houver umctty
anexo ou nãobackground
-without ctty
-processes
enviados para segundo plano enquanto estãoctty
, e se tornam daemons ou morrem sectty
lhes forem tirados.
background-process
daemon
job-control
zombie-process
controlling-terminal
anatoly techtonik
fonte
fonte
fork()
tirar uma cópia de si mesmo, useexec()
nessa cópia para substituí-lo pelo que você deseja executar e usewait()
na instância original do programa (não na cópia executadaexec()
). No período muito curto de tempo entre o momento em que a criança sai e o momento emwait()
que colhe o status (removendo-o da tabela de processos e devolvendo-o ao chamador), você tem um zumbi.Respostas:
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:
waitpid(2)
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
, usandofg
ebg
). 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^C
forem 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
init
que os limpa quando eles saem, para que você não os veja como zumbis.Vejo:
daemon(7)
.fonte
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()s
pró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 oinit
programa ou atualmentesystemd
. 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
bg
comando 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.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.fonte
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 explicitamentedisown
editado 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áriossh
foi para uma máquina remota, iniciou algo como um servidor da Web, depois executoudisown
nela e saiu dassh
sessã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á-lonohup
.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 pressionarctrl+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.
fonte
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 corrertop
do seu terminal e pressionarshift-v
para ver as árvores de processo em estado selvagem.