# Daemon (computação)

Em sistemas operacionais multitarefa, um daemon é um programa de computador que executa como um processo em plano de fundo, em vez de estar sob o controle direto de um usuário interativo. Tradicionalmente, o nome de processo de um daemon termina com a letra d, para deixar claro que o processo é, de fato, um daemon, e para diferenciação entre um daemon e um programa de computador normal. Por exemplo, syslogd é o daemon que implementa o recurso de logging do sistema e sshd é um daemon que serve conexões SSH de entrada.
Em um ambiente Unix, o processo pai de um daemon normalmente é, mas nem sempre, o processo init. Um daemon normalmente é criado ou por um processo que bifurca um processo filho e então sai imediatamente ("fork off and die"), fazendo assim com que o init adote o processo filho, ou pelo processo init executando diretamente o daemon. Além disso, um daemon executado pela bifurcação e saída normalmente deve realizar outras operações, como a dissociação do processo de qualquer terminal (tty) de controle. Tais procedimentos normalmente são implementados em várias rotinas convenientes como daemon(3) em Unix.
Os sistemas geralmente inicializam daemons no momento do boot e servem a função de responder a requisições de rede, atividade de hardware ou outros programas por meio da realização de algumas tarefas. Daemons podem também configurar o hardware (como udev em alguns sistemas linux), executar tarefas agendadas (como cron) e realizar uma variedade de outras tarefas.

## Terminologia

O termo foi cunhado pelos programadores do Projeto MAC do MIT. Eles pegaram o nome de Maxwell's daemon, um ser imaginário de uma experiência de pensamento que trabalha constantemente em plano de fundo, reordenando moléculas. Sistemas Unix herdaram esta terminologia. Maxwell' Denib é consistente com a interpretação da mitologia grega de um daemon como um ser sobrenatural trabalhando em plano de fundo, sem viés particular, para o bem ou para o mal. No entanto, o BSD e alguns de seus derivados têm adotado um demônio do cristianismo como seu mascote, em vez de um daemon grego.
A palavra daemon é uma forma alternativa de escrever demônio e é pronunciada / diːmən / dee-mən. No contexto de software, a pronúncia original /diːmən/ derivou para /deɪmən/ dia-mən para alguns falantes.
Termos alternativos para daemon são serviço (Microsoft Windows NT), tarefa iniciada (IBM z/OS) e trabalho fantasma (XDS UTS).
Após o termo ter sido adotado para o uso em computador, ele foi racionalizado como um "backronym" para Disk And Execution MONitor (Monitor de Disco e Execução).

## Criação

Em um senso estritamente técnico, um processo de sistema do tipo Unix é um daemon quando seu processo pai termina e o daemon é atribuído ao processo init (número de processo 1) como seu processo pai e não possui terminal de controle. Entretanto, mais comumente, um daemon pode ser qualquer processo de plano de fundo seja um filho do processo init ou não.
Em um sistema do tipo Unix, o método comum para um processo se tornar um daemon, quando o processo é iniciado de uma linha de comando ou de um script de inicialização como um script init ou um script SystemStarter, envolve:
* Desassociação do tty de controle
* Tornar-se líder de uma sessão
* Tornar-se líder de um grupo de processo
* Executar como uma tarefa de plano de fundo por bifurcação e saída (uma ou duas vezes). Isto é requerido algumas vezes para o processo se tornar líder de uma sessão. Também permite que o processo pai continue sua execução normal
* Definir o diretório raiz (/) como o diretório de trabalho atual de forma que o processo não mantenha qualquer diretório em uso que possa estar em um sistema de arquivos montado (permitindo que eles seja desmontado)
* Alterar a umask para 0 para possibilitar que open, creat e outras chamadas do sistema operacional forneçam suas próprias máscaras de permissão e não dependam da umask do chamador
* Fechar todos os arquivos herdados no momento da execução que são deixados abertos pelo processo pai, incluindo descritores de arquivo 0, 1 e 2 para os fluxos padrões (stdin, stdout e stderr). Arquivos requeridos serão abertos posteriormente.
* Usar um logfile, o console ou /dev/null como stdin, stdout e stderr
Se o processo for iniciado por um daemon super-server, como inetd, launchd ou systemd, o daemon super-server realizara estas funções para o processo (exceto para daemons de estilo antigo não convertidas para executar sob systemd e especificadas como servidores de datagrama Type=forking e "multi-threaded" sob inetd).