Terminale di Controllo e 'demoni'
Situazione in Ubuntu 16.04
Esempio:
$ sleep 1234 &
[4] 28109
$ ps lax | grep 1234
0 1000 18518 18514 20 0 310804 12344 poll_s S ? 0:00 /usr/share/code/code --type=zygote --no-sandbox
0 1000 28109 27384 20 0 7296 796 hrtime S pts/1 0:00 sleep 1234
0 1000 28111 27384 20 0 14228 1012 pipe_w S+ pts/1 0:00 grep --color=auto 1234
$
Evidentemente grep
trova più linee con la stringa 1234. Nella nostra il cammpo TTY vale pts/1
e il campo PPID vale 27384
.
Ora chiudiamo il terminale. Poi apriamone un altro e ripetiamo:
$ ps lax | grep 1234
0 1000 18518 18514 20 0 310804 12344 poll_s S ? 0:00 /usr/share/code/code --type=zygote --no-sandbox
0 1000 28109 1488 20 0 7296 796 hrtime S ? 0:00 sleep 1234
0 1000 28367 28350 20 0 14228 1064 pipe_w S+ pts/16 0:00 grep --color=auto 1234
$
Il processo esiste ancora, ma ora:
- il TTY è
?
, ovvero non esiste - il PPID è 1488, che a ulteriore investigazione si rivela essere il processo
upstart
Il nostro processo è diventato un demone, che non ha più terminale di controllo.
Su Ubuntu 16.04 LTS tutti i demoni diventano figli del processo upstart
.
Situazione in Red Hat Enterprise Linux
La figura seguente indica invece il comportamento su RHEL.
I processi che non hanno più terminale di controllo, di default muoiono.
Per farli continuare a vivere, e diventare demoni, occorre al loro lancio dare il comando shell prefisso nohup
:
$ nohup sleep 1234 &
[1] 28509
$ nohup: ignoring input and appending output to 'nohup.out'
$
Questo li stacca già fin dasubito dall'input e ridirigel'eventuale output in un file d'ufficio.
Il comando nohup
indica di ignorare il segnale numero 1 - hangup.
i demoni sono immuni a questo segnale.
Per non sprecare un segnale è da (abbastanza) anni ormai invalsa la consuetudine che ricicla il segnale di hangup, quando ricevuto da un demone:
- viene compiuto un warmstart cioè una reinizializzazione del processo senza però terminare e ripartire (che sarebbe un coldstart). Per esempio vengono riletti i file di configurazione.