Mandare un processo in background e foreground con Linux
Attenzione
Questo articolo è stato pubblicato più di un anno fa, potrebbero esserci stati sviluppi.
Ti preghiamo di tenerne conto.
Qualche articolo fa abbiamo parlato di screen
: un applicativo a riga di comando che permette di creare sessioni virtuali contenenti finestre di terminale virtuali a cui possiamo collegarci o scollegarci a piacimento tramite la sessione terminale corrente.
Screen è un programma molto potente, intuitivo dopo qualche utilizzo, che può fare molte cose (e infatti le scorciatoie sono moltissime e troppe da elencare), ma oggi parliamo delle sessioni classiche.
Anche in questo caso un comando può durare svariati minuti, o anche delle ore. Si rende quindi necessario un sistema per liberare il terminale ed eseguire nuovi comandi, lasciando quelli vecchi in esecuzione in background.
Avviare un processo in background
Supponiamo di avere un processo che, una volta eseguito, occupa la sessione terminale e ci impedisce di eseguire altri comandi fino alla fine dell’esecuzione. Ad esempio, nel caso in cui il disco dati utilizzato sia grande e pieno di dati updatedb
può metterci veramente molto a terminare l’indice dei file.
~# updatedb
Abbiamo due soluzioni.
Usare la “e – commerciale” (&)
Il primo metodo è semplicemente aggiungere una & alla fine del comando. Il processo andrà automaticamente in background, la shell verrà liberata e potrà essere usata immediatamente.
~# updatedb &
[1] 342824
~#
In questo scenario, oltre a rendere disponibile il terminale subito, il comando restituisce il numero identificativo del processo (PID) con il quale possiamo monitorare lo stato di esecuzione tramite il comando ps
.
~# ps ax | grep updatedb
342824 pts/2 S 0:00 /bin/sh /usr/bin/updatedb
~#
Usare la scorciatoia Ctrl+Z e il comando bg
Questo metodo è anche più interessante del primo, perché anche se non prevediamo che il comando possa bloccare il terminale per molto tempo, potremo mettere il processo in pausa e mandarlo in background per proseguire l’esecuzione.
~# updatedb
^Z # Here i clicked Ctrl+Z
[2]+ Fermato updatedb
~# bg
[2]+ updatedb &
~#
Qui sopra ho lanciato ancora il comando updatedb
, l’ho messo in pausa con la scorciatoia Ctrl+Z
, ho lanciato il comando bg
per mettere in background il comando in pausa.
Una lista dei processi in background
Si, ma non vorrei perdere il controllo. Quanti e quali processi ho mandato in background?
:~# jobs
[1]- In esecuzione sleep 500 &
[2]+ In esecuzione updatedb &
~#
Per riprendere un processo usiamo il comando fg
insieme al numero relativo al processo che vogliamo ripristinare.
~# jobs
[1]- In esecuzione sleep 500 &
[2]+ In esecuzione updatedb &
~# fg %2
updatedb
Ovviamente possiamo mettere nuovamente il comando appena ripristinato in background con Ctrl+Z
e bg
chiudendoci in un loop eterno.
Rendere persistente un processo anche alla chiusura della shell
Quando un processo è stato messo in background da una sessione, alla chiusura della sessione anche il processo terminerà. Questo aspetto può rappresentare un problema soprattutto nel caso di connessioni instabili (SSH).
La cosa più semplice in questi casi è usare screen
, ma in generale se questo non è ciò che vogliamo possiamo rendere persistente un processo anche dopo la chiusura della sessione semplicemente dalla sessione con il comando nohup
.
Tale comando è immune agli hang-up e può ignorare i segnali SIGHUP lanciati a un processo.
Il comando nohup
va usato prima del processo che vogliamo “scollegare”.
~# nohup updatedb &
Ora possiamo terminare la sessione corrente, aprire un altro terminale e controllare che il processo sia ancora in esecuzione con ps ax | grep updatedb
.
0 commenti