Poter spostare o eseguire i comandi in background su Linux è utile per poter riavere il terminale utilizzabile o anche solo per poterlo chiudere senza che i processi vengano interrotti e senza dover aspettare che siano completati.
In questa guida vedremo i diversi metodi per gestire i comandi in background: da come si lancia un comando in background a come si gestisce l’output fino al passaggio inverso per far tornare il comando in foreground.
Iniziamo!
Indice
Come funzionano i processi su Linux: foreground e background
In genere i processi avviati da terminale vengono eseguiti in foreground. Questo vuol dire che durante l’esecuzione del processo, il terminale viene bloccato e se il processo prevede degli output questi vengono mostrati.
I processi però possono anche essere spostati in background, in questo modo continuano ad essere eseguiti, ma lasciano il terminale libero e utilizzabile.
In questa guida vedremo come fare a gestire i processi eseguendoli in background e facendoli ritornare in foreground.
Come eseguire un comando in background
Per eseguire un comando in background ci basta aggiungere il simbolo “&” dopo il comando, in questo modo:
[comando] &
Per esempio:
ping google.com &
Appena dato il comando, vedremo in output una cosa del genere:
[1] 16688
- il numero tra parentesi quadre, nel nostro esempio [1], è l’ID del processo in background nella sessione corrente;
- il secondo numero rappresenta il PID cioè l’ID del processo che lo distingue da tutti gli altri processi che sono in esecuzione nel sistema operativo in quel momento.

Quando mandiamo un processo in background in questo modo, se il processo prevede un output, questo continuerà a essere mostrato nel terminale, vediamo perciò come fare a evitarlo.
Come eseguire un comando in background disattivando l’output
Nell’esempio precedente abbiamo visto come mandare in background un comando, ma se proviamo a eseguire il comando dell’esempio ci renderemo conto che l’output continua a essere mostrato nel terminale e quindi rende di fatto il terminale inutilizzabile.
Per fortuna c’è una strada alternativa ed è quella di reindirizzare l’output, sia stdout che stderr, in modo che non venga mostrato nel terminale.
Se non abbiamo bisogno di ricontrollare l’output del comando, possiamo eliminarlo e quindi possiamo usare il comando seguente:
[comando] > /dev/null 2>&1 &
In un esempio concreto avremo:
ping google.com > /dev/null 2>&1 &
Se, invece, abbiamo bisogno di conservare l’output, possiamo creare un file di log in questo modo:
ping google.com > output-ping.log 2>&1 &
Ovviamente possiamo cambiare il nome del file di log sostituendolo al posto di quello che ho usato io in questo esempio “output-ping.log”.
Come conoscere i comandi in esecuzione in background
Il vantaggio di eseguire comandi in background è che possiamo eseguire più di un processo contemporaneamente. Per conoscere tutti i processi in background nella sessione corrente, ci basta usare il comando jobs in questo modo:
jobs -l
L’output sarà simile a questo:
[1]- 18000 In esecuzione ping google.com > output-ping.log 2>&1 &
L’output del comando ci permette di ricavare informazioni importanti:
- il numero indicato tra parentesi quadre indica l’ID del processo in background (riferito solo alla sessione corrente);
- il secondo numero è l’ID del processo (PID);
- viene poi indicato lo stato, ad esempio “In esecuzione” o “Fermato”;
- per finire viene indicato il comando che ha avviato il processo.

Come terminare i processi in background
Conoscere l’ID o il PID è fondamentale per poter agire sui processi, ad esempio per portarli di nuovo in foreground, come vedremo nelle prossime sezioni.
Conoscendo il PID di un processo, possiamo anche terminarlo usando il comando kill, in questo modo:
kill [pid]
Ad esempio:
kill 18727
Per la chiusura forzata possiamo usare l’opzione -9 insieme al comando kill, come abbiamo visto anche nella guida sulla gestione dei processi.
Tieni presente che se hai usato disown o nohup per mandare un processo in background, non lo vedrai nella lista se usi il comando jobs. In questi casi quindi puoi recuperare il PID dalla lista dei processi attivi usando ad esempio il comando:
ps aux
Come mandare in background un processo in esecuzione
All’inizio di questa guida abbiamo visto come avviare un processo in background, ci sono però casi in cui vogliamo agire su processi già in esecuzione. In questo caso per poter passare dal foreground al background, dobbiamo prima di tutto fermare il processo.
Vediamo come si fa con un esempio concreto.
Abbiamo eseguito un comando per eseguire un file audio con il comando mpv e vogliamo spostare il processo in background in modo da poter utilizzare di nuovo il terminale.
Per prima cosa usiamo Ctrl + Z per interrompere il comando.
Nel terminale ci verrà mostrato l’ID del processo e lo stato “Fermato”.
Se abbiamo solo un singolo processo sospeso, ci basta usare il comando bg per far ripartire il processo ma questa volta in background.

Altrimenti dovremo anche indicare l’ID del processo che vogliamo far ripartire in background, così:
bg %ID
Per esempio:
bg %2
Come spostare in foreground un processo in background
Così come è possibile spostare in background i processi in esecuzione, è anche possibile fare il processo inverso e cioè riportare in foreground i processi che abbiamo eseguito in background.
Per farlo ci basta usare il comando fg seguito dall’ID del processo in background (quello indicato tra parentesi quadre) o dal PID.
Se usiamo l’ID dobbiamo indicare prima dell’ID del processo, il simbolo %, così:
fg %ID
Per esempio per il processo corrispondente all’ID 1, avremo:
fg %1
Altrimenti possiamo usare il l’ID completo del processo, come in questo esempio:
fg 18727
Come eseguire comandi in background e chiudere il terminale
Quando mandiamo in background un processo, questo continuerà a essere eseguito solo finché il terminale resta aperto. Questo costituisce un problema se ad esempio voglio lanciare un comando dopo aver effettuato una connessione a un server remoto e voglio disconnettermi.
Per fortuna, però, c’è un altro modo per far sì che i processi continuino a funzionare anche dopo che abbiamo chiuso il terminale o ci siamo disconnessi. Per la precisione si possono usare due sistemi che ignorano SIGHUP, cioè il segnale che dice al processo di interrompersi quando il terminale viene chiuso, si tratta di nohup e disown.
Vediamo come si usano.
Suggerimento: quando usiamo nohup o disown, i processi vengono scollegati dal terminale e quindi non compaiono più nella lista se usiamo ad esempio il comando jobs. Per terminarli, ci basta annotarci il PID e usare il comando kill. In alternativa possiamo sempre recuperarli nelle liste di processi attivi usando il comando ps o htop.
Esecuzione in background con disown
Il comando disown ci permette di far sì che i processi continuino a essere eseguiti anche dopo che ci disconnettiamo ed è quindi perfetto ad esempio per lanciare un comando dopo esserci collegati via ssh a un server remoto in modo da poterci scollegare senza problemi.
Il comando si usa direttamente così se vogliamo applicarlo a tutti i processi:
disown
Oppure, se vogliamo usarlo per un singolo processo, dovremo indicare l’ID del processo:
disown %ID
Per esempio:
disown %1

Nella pratica, quando usiamo disown, se ci scolleghiamo o il terminale viene chiuso, non viene inviato il segnale SIGHUP e quindi i processi in background non vengono interrotti.
Quello che può succedere però usando disown è che non viene disattivato l’output e quindi se il terminale viene chiuso, si possono generare degli errori. In questo caso si possono reindirizzare gli errori verso un file di log come abbiamo visto prima oppure si può usare direttamente il comando nohup.
Esecuzione in background con nohup
Il comando nohup funziona in modo simile a disown e si usa per far sì che dopo aver chiuso il terminale, non venga inviato il segnale di interruzione e quindi i processi in background continuino ad essere eseguiti regolarmente.
In questo caso, però nohup ha anche un asso nella manica in più perché andrà a reindirizzare direttamente tutto l’output nel file nohup.out.
Il comando si usa in questo modo:
nohup [comando] &
Per esempio:
nohup ping google.com &

Dopo aver eseguito il comando vedremo il PID del processo che, come sottolineavamo anche prima, ci può servire per terminare il processo con il comando kill.
Conclusioni
Ci sono casi in cui avere i comandi in esecuzione in primo piano non è l’ideale, ad esempio perché vogliamo avere il terminale libero o vogliamo disconnetterci da un server remoto senza bloccare i processi. In tutte queste circostanze, ci basta eseguire i comandi in background. È altrettanto importante però sapere come gestire i processi in background ed eventualmente poterli anche terminare oltre che conoscere il metodo per riportarli in primo piano.
E tu avevi mai avviato un processo in background? In quale occasione? Parlacene nei commenti.
Pronto a costruire il tuo sito WordPress?
Prova il nostro servizio gratuitamente per 14 giorni. Nessun impegno, nessuna carta di credito richiesta.