Do artigo da Wikipedia sobre o daemon :
Em um ambiente Unix, o processo pai de um daemon é frequentemente, mas nem sempre, o processo init. Geralmente, um daemon é criado por um processo que bifurca um processo filho e, em seguida, sai imediatamente, fazendo com que o init adote o processo filho ou pelo processo init, ativando diretamente o daemon. Além disso, um daemon lançado por bifurcação e saída normalmente deve executar outras operações, como dissociar o processo de qualquer terminal de controle (tty). Esses procedimentos geralmente são implementados em várias rotinas de conveniência, como o daemon (3) no Unix.
Leia a manpage da função daemon
.
A execução de um comando background a partir de um shell que sai imediatamente resulta em que o PPID do processo se torne 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 é de propriedade do PID 1, mas ainda está associado a um TTY. Se eu sair desse shell de login, faça o login novamente e execute ps
novamente, o TTY se tornará ?
.
Leia aqui porque é importante destacar o 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
Acho que você nem precisa redirecionar stdin, stdout e stderr.