Daemonize um processo no shell?

9

http://linuxg.net/how-to-transform-a-process-into-a-daemon-in-linux-unix/ fornece um exemplo de daemonização de um processo no bash:

$ nohup firefox& &> /dev/null

Se eu estiver correto, o comando será o mesmo que "nohup e plano de fundo de um processo". Mas um daemon não é mais que um processo sem backup e em segundo plano?

Quais etapas estão faltando aqui para daemonize um processo?

Por exemplo, não é necessário alterar o processo pai ao daemonizar um processo? Se sim, como você faz isso no bash? Ainda estou tentando entender uma resposta relacionada https://unix.stackexchange.com/a/177361/674 .

Que outras etapas e condições?

Veja minha pergunta relacionada https://stackoverflow.com/q/35705451/156458

Tim
fonte
1
depende da sua definição de daemons. Se você quer apenas rodar em segundo plano desconectado de um terminal, sim, você está executando o firefox como um daemon. Os daemons "padrão", no entanto, normalmente não são executados pelos usuários, possuem um script init e log, e geralmente algum tipo de segurança, geralmente apparmor ou selinux, dependendo se você estiver executando o Ubuntu ou Fedora (ou similar). Veja linfo.org/daemon.html .
Pantera
1
Dê uma olhada no start-stop-daemon Debian; Vou deixar aqui um thread relacionado do estouro de pilha stackoverflow.com/questions/16139940/… que é mais interessante do que a página de manual bruta
Rui F Ribeiro

Respostas:

10

No artigo da Wikipedia sobre daemon :

Em um ambiente Unix, o processo pai de um daemon é frequentemente, mas nem sempre, o processo init. Um daemon geralmente é criado por um processo que bifurca um processo filho e sai imediatamente, fazendo com que o init adote o processo filho ou pelo processo init que inicia diretamente o daemon. Além disso, um daemon iniciado pela bifurcação e pela saída normalmente deve executar outras operações, como dissociar o processo de qualquer terminal de controle (tty). Tais procedimentos são frequentemente implementados em várias rotinas de conveniência, como o daemon (3) no Unix.

Leia a página de manual da daemonfunção.

A execução de um comando em segundo plano a partir de um shell que sai imediatamente resulta em 1. O PPID do processo se torna 1. Fácil de testar:

# bash -c 'nohup sleep 10000 &>/dev/null & jobs -p %1'
1936
# ps -p 1936
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     1936       1    9104       9552  cons0       1009 17:28:12 /usr/bin/sleep

Como você pode ver, o processo pertence ao PID 1, mas ainda está associado a um TTY. Se eu sair desse shell de logon, efetue login novamente e faça psnovamente, o TTY se tornará ?.

Leia aqui por que é importante desanexar do TTY .

Usando setsid(parte de util-linux):

# bash -c 'cd /; setsid sleep 10000 </dev/null &>/dev/null & jobs -p %1'
9864
# ps -p 9864
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     9864       1    9864       6632  ?           1009 17:40:35 /usr/bin/sleep

Eu acho que você nem precisa redirecionar stdin, stdout e stderr.

Gene Pavlovsky
fonte
3
Dê uma olhada em daemonize . Além de uma boa ferramenta, possui boas explicações sobre o que é um daemon.
Gene Pavlovsky
Só estou curioso se você conhece uma maneira de dissociar o processo do tty sem sair do shell do qual o processo foi gerado.
precisa saber é o seguinte
1
@StoneThrow "sem sair do shell do qual o processo foi gerado" Se você usar o bash -cwrapper, não haverá TTY associado ao processo. É realmente como ele demonstrou.
Bruno Bronosky
O @StoneThrow, mas fazer esse teste echo "outer tty: $(tty)"; ls -la $(dirname $(tty)); bash -c 'echo "inner tty: $(tty)"; ls -la $(dirname $(tty));', mostrará que é exatamente o mesmo TTY para ambos, mas o comportamento demonstrado de obter um TTY ?ainda acontece, mesmo que você nunca "saia do shell" nem feche o TTY.
Bruno Bronosky
-1

Um daemon, por seu nome, nada mais é do que um programa que é executado até 1. o sistema ser desligado; 2. é solicitado a parar. Fora isso, não tem significado mágico.

Nessas circunstâncias, a execução de um script bash em segundo plano com nohup pode classificá-lo como um processo daemon.

O que você espera encontrar e não encontrar? Se você estiver tendo problemas, indique-os com código de amostra e segmentos de dados de amostra para solicitar mais ajuda. Sua pergunta, como está agora, é muito ampla / geral.

MelBurslan
fonte
Obrigado. Acho que meu post tem tudo o que você pediu no seu último parágrafo.
Tim
4
Umm, isso não é verdade. Um daemon não tem Terminal de controle, não possui stdout ou stderr, e algumas outras coisas. Leia a primeira estrofe de software.clapper.org/daemonize
Rich Homolka