Dall'articolo di Wikipedia sul demone:
In un ambiente Unix, il processo padre di un demone è spesso, ma non sempre, il processo init. Un demone viene solitamente creato o da un processo che esegue il fork di un processo figlio e quindi esce immediatamente, facendo sì che init adotti il processo figlio, oppure dal processo init che avvia direttamente il demone. Inoltre, un demone lanciato da fork ed exit tipicamente deve eseguire altre operazioni, come dissociare il processo da qualsiasi terminale di controllo (tty). Tali procedure sono spesso implementate in varie routine di convenienza come daemon(3) in Unix.
Leggi la manpage di daemon
funzione.
L'esecuzione di un comando in background da una shell che esce immediatamente fa sì che il PPID del processo diventi 1. Facile da testare:
# 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
Come puoi vedere, il processo è di proprietà del PID 1, ma è ancora associato a un TTY. Se mi disconnetto da questa shell di login, accedo di nuovo ed eseguo ps
di nuovo, il TTY diventa ?
.
Leggi qui perché è importante distaccarsi da TTY.
Usando setsid
(parte di 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
Penso che non devi nemmeno reindirizzare stdin, stdout e stderr.