Quais são as diferenças práticas do ponto de vista do sysadmin ao implantar serviços em um sistema baseado em unix?
Quais são as diferenças práticas do ponto de vista do sysadmin ao implantar serviços em um sistema baseado em unix?
Respostas:
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.
&
explicação da peça à sua resposta. Parece estar incompleto .. se você verificar a pergunta original.
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
) ...
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.
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 HUP
sinal 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.out
ou2>errors.out
Você também pode ter acesso, na maioria dos sistemas, ao nohup
comando.
nohup
simplifica 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.
command &
shell posterior com o disown
qual funciona como um pós-nohup.