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.

Demone

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.