Quais são as diferenças práticas do ponto de vista do sysadmin ao implantar serviços em um sistema baseado em unix?
46
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
) ...fonte
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.
fonte
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:
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:..e você está pronto. A saída é redirecionada, IIRC, para
nohup.out
, mas esse nome de arquivo pode ser alterado com uma opção.fonte
command &
shell posterior com odisown
qual funciona como um pós-nohup.