In una precedente lezione abbiamo richiamato il concetto di background, nella lezione pubblicata subito prima di questa abbiamo invece chiarito come inviare segnali di terminazione utilizzando il comando kill. Uno dei segnali di cui abbiamo parlato è SIGHUP. Esiste un modo per rendere un processo immune al segnale SIGHUP attraverso un comando che oltre far ciò redirige l'output verso un file. Per ottenere questo effetto dobbiamo lanciare un comando come argomento di nohup. Osserveremo quanto descritto effettivamente all'opera nel terminale riportato a seguire anche se, per ragioni di praticità, andiamo a spiegare in dettaglio ciò che vedremo immediatamente.
Uso di nohup
Il comando nohup è uno dei più semplici da adoperare. Viene presentato ora perché può essere compreso appieno solo dopo le lezioni precedenti e anche perché rivela spunti interessanti su quanto sino a ora abbiamo affrontato. Innanzi tutto, adoperando ps, andiamo a consultare i processi attivi. Scopriamo che il PID 6955 è un processo che intendiamo terminare. Inviamo quindi allo stesso un segnale di SIGHUP tramite il comando kill e constatiamo sempre tramite ps che effettivamente il processo in questione è stato rimosso dalla lista dei processi attivi. A questo punto, se eseguiamo lo stesso comando che aveva generato il processo appena terminato passandolo tuttavia come argomento a nohup otterremo un processo sordo a questo specifico segnale di terminazione. Inoltre nohup sta provvedendo a redirigere lo output verso il file nohup.txt. Abbiamo la possibilità di imporre a nohup l'indirizzazione dello output verso un file diverso passando come ultimo argomento ">" seguito dal nome del file. Stiamo eseguendo nohup in background poiché l'ultimo carattere del comando con cui lo abbiamo lanciato era la "&" ma possiamo comunque visionarne lo output in tempo reale adoperando il comando tail -f che restituisce a schermo dinamicamente un file a cui vengono aggiunte in coda nuove righe.
fprincipe@html52:~$ ps -uf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
[...]
fprinci+ 1979 0.0 0.5 21476 5524 pts/1 Ss+ 15:08 0:00 -bash
fprinci+ 6955 0.0 0.3 11592 3204 pts/1 S 16:02 0:00 \_ /bin/bash ./long.sh
fprinci+ 7233 0.0 0.0 6176 796 pts/1 S 16:04 0:00 \_ sleep 1
[...]
fprinci+ 1636 0.0 0.5 21288 5048 pts/0 Ss+ 14:50 0:00 /bin/bash
fprinci+ 1624 0.0 0.4 21460 5012 tty1 S 14:48 0:00 -bash
fprinci+ 1634 0.0 0.3 30136 3220 tty1 S+ 14:50 0:00 \_ screen
fprincipe@html52:~$ kill -s SIGHUP 6955
fprincipe@html52:~$ ps -uf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
fprinci+ 7142 0.0 0.5 21476 5296 pts/2 Ss 16:03 0:00 -bash
fprinci+ 7290 0.0 0.3 38372 3728 pts/2 R+ 16:05 0:00 \_ ps -uf
fprinci+ 1979 0.0 0.5 21476 5524 pts/1 Ss+ 15:08 0:00 -bash
fprinci+ 1807 0.0 0.4 21288 4880 pts/5 Ss 15:06 0:00 /bin/bash
fprinci+ 1816 0.0 0.3 20004 3816 pts/5 S+ 15:06 0:00 \_ man screen
fprinci+ 1825 0.0 0.0 19740 828 pts/5 S+ 15:06 0:00 \_ man screen
fprinci+ 1826 0.0 0.1 8556 1104 pts/5 S+ 15:06 0:00 \_ pager
fprinci+ 1636 0.0 0.5 21288 5048 pts/0 Ss+ 14:50 0:00 /bin/bash
fprinci+ 1624 0.0 0.4 21460 5012 tty1 S 14:48 0:00 -bash
fprinci+ 1634 0.0 0.3 30136 3220 tty1 S+ 14:50 0:00 \_ screen
fprincipe@html52:~$ nohup ./long.sh &
[1] 7293
fprincipe@html52:~$ nohup: ignoring input and appending output to 'nohup.out'
fprincipe@html52:~$ tail -f nohup.out
[...]
Long
Long
Long
[...]
fprincipe@html52:~$ ps -uf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
[...]
fprinci+ 7293 0.0 0.3 11592 3076 pts/2 S 16:06 0:00 \_ /bin/bash ./long.sh
fprinci+ 7339 0.0 0.0 6176 776 pts/2 S 16:06 0:00 | \_ sleep 1
[...]
fprincipe@html52:~$ kill -s SIGHUP 7293
fprincipe@html52:~$ ps -uf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
fprinci+ 7142 0.0 0.5 21476 5476 pts/2 Ss 16:03 0:00 -bash
fprinci+ 7293 0.0 0.3 11592 3076 pts/2 S 16:06 0:00 \_ /bin/bash ./long.sh
fprinci+ 7398 0.0 0.0 6176 828 pts/2 S 16:07 0:00 | \_ sleep 1
[...]