Qual é a diferença entre executar um programa como um daemon e colocá-lo em segundo plano com '&'?

46

Quais são as diferenças práticas do ponto de vista do sysadmin ao implantar serviços em um sistema baseado em unix?

user1561108
fonte

Respostas:

31

A maneira tradicional de daemonizing é:

fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()

Isso garante que o processo não esteja mais no mesmo grupo de processos que o terminal e, portanto, não será eliminado junto com ele. O redirecionamento de entrada / saída é fazer com que a saída não apareça no terminal.

Dennis Kaarsemaker
fonte
5
portanto, se um terminal que gera um processo em segundo plano (&) for fechado, o processo em segundo plano também será encerrado?
user1561108
9
O processo receberá SIGHUP quando o terminal sair, o manipulador padrão para esse sinal é finalizar o processo.
Dennis Kaarsemaker
12
Adicione a &explicação da peça à sua resposta. Parece estar incompleto .. se você verificar a pergunta original.
mtk
1
Isso porque correr as coisas no fundo com & não faz o processo de fazer nada de especial :)
Dennis Kaarsemaker
34

Para um daemon, o que você deseja é um processo que não tem vínculo com nada. No mínimo, você deseja que ele seja em sua própria sessão, não seja anexado a um terminal, não tenha nenhum descritor de arquivo herdado do pai aberto a qualquer coisa, não tenha um pai que cuide de você (exceto init) diretório /para não impedir uma quantidade ...

Para desanexar de um terminal, você cria uma nova sessão; no entanto, para criar uma sessão, você não deve ser um líder de grupo (ou sessão); portanto, o melhor é forçar um novo processo. Supondo que o pai saia, isso também significa que o processo não terá mais um pai e será adotado pelo init. Em seguida, feche todos os descritores de arquivos possíveis chdir("/")( você não pode fechar o diretório de trabalho atual para liberar esse recurso como para os descritores de arquivos, tornar /os diretórios de trabalho atuais pelo menos não impede a desmontagem de diretórios).

Como esse processo é líder de sessão, existe o risco de que, se algum dia abrir um dispositivo de terminal, ele se torne o processo de controle desse terminal. A bifurcação uma segunda vez garante que isso não aconteça.

Por outro lado, &, em shells interativos, bifurca e cria um novo grupo de processos (para não estar no grupo de processos em primeiro plano do terminal), e em shells não interativos, bifurca um processo e ignora o SIGINT nele. Ele não se desconecta do terminal, não fecha os descritores de arquivo (embora alguns shells reabram o stdin /dev/null) ...

Stéphane Chazelas
fonte
para que serve chdir ("/")? fechar o descritor de arquivo?
Timothy Leung
@TimothyLeung, veja editar.
Stéphane Chazelas
8

A diferença entre executar um programa / processo como um daemon e transferi-lo para segundo plano usando o e comercial está basicamente relacionada à propriedade.

Na maioria das vezes, o processo pai de um daemon é o processo init (o primeiro processo a ser iniciado em um sistema Unix), sendo o daemon filho desse processo, significa que ele não está sob seu controle direto como usuário não privilegiado . Por outro lado, colocar um programa / processo em segundo plano significa que você pode chamá-lo de volta a qualquer momento e / ou matá-lo.

Odaym
fonte
1
Também para atender a acima lado técnico de separar um processo contra mantendo-o como um filho do terminal, você pode tentar executar "nohup firefox &"
Odaym
7

Com command &Seu processo será interrompido por um sinal SIGHUP quando os pais morrerem.

Os administradores do sistema têm acesso a algumas soluções alternativas.

Em um sistema bash, você pode usar:

(trap '' HUP; command) &

Isso abre um subshell, captura o HUPsinal com um manipulador vazio e o e comercial / bifurca-se.

A saída ainda pode ser redirecionada para o errado tty. Ou se perca.
Você pode corrigir isso com &>command.out, 1>output.outou2>errors.out

Você também pode ter acesso, na maioria dos sistemas, ao nohupcomando.
nohupsimplifica muito esse processo. É bastante padrão, mas eu encontrei muitas distribuições ARM incorporadas do busybox. Você acabou de escrever:

nohup command &

..e você está pronto. A saída é redirecionada, IIRC, para nohup.out, mas esse nome de arquivo pode ser alterado com uma opção.

ZJR
fonte
2
Apenas observe que, com o ZSH, você pode desacoplar um command &shell posterior com o disownqual funciona como um pós-nohup.
math