L'esecuzione in background (dall'inglese background che indica sfondo o in secondo piano) è una modalità di esecuzione tipica di alcuni programmi che non richiedono la presenza o l'intervento dell'utente, e che può essere concorrente all'esecuzione di altri programmi risultando così ignari all'utente. I processi in background non sono visibili sullo schermo. Ad esempio Apache httpd server viene eseguito in background per servire le pagine web. Puoi mettere in background il tuo script o qualsiasi comando.
I software che lavorano in background fanno tipicamente operazioni lunghe o laboriose, ad esempio programmi di filesharing, peer to peer o che effettuano la deframmentazione dei file system. Anche molti processi dei sistemi operativi girano in background. Nei sistemi operativi Microsoft Windows i programmi in tale modalità (possono essere antivirus che scansionano il sistema o fanno l'aggiornamento) spesso collocano un'icona nella system tray (l'area del desktop accanto all'orologio di sistema) per segnalare la loro attività, e adottano comportamenti che riducono l'utilizzo di risorse in modo da non interferire con le attività interattive dell'utente, ad esempio rallentandolo o causandogli interruzioni. Nei sistemi Unix e Unix-like i processi che girano in background vengono detti demoni e l'uso di un task manager consente di conoscere tutti i programmi in esecuzione compresi quelli in background.
Sintassi
Si può mettere un'operazione (come un comando o uno script) in background aggiungendo un ampersand o e commerciale (&) alla fine del comando. L'operatore & esegue il comando in background e libera il tuo terminale. Il comando che viene eseguito in background si chiama job. È possibile digitare un'altro comando mentre il comando in background è in esecuzione. La sintassi è:
comando &
nome-script &
/percorso/comando arg1 arg2 &
commando-1 | commando-2 arg1 &
commando-1 | commando-2 -arg1 -arg2 >/percorso/output &
Esempi
Per eseguire il comando in background, digita:
$ ls *.py > output.txt &
Avvia il comando find in background mettendo una '&' alla fine della linea di comando:
find . -iname "*.mp3" > miaplaylist.txt &
Output esempi:
Come faccio a vedere i jobs avviati in background?
Digita il seguente comando:
jobs
Ecco l'outputs:
[1]- Running find / -iname "*.c" 2> /dev/null > /tmp/output.txt &
[2]+ Running grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt &
Dove, [1] e [2] sono gli ID dei jobs.
Per visualizzare gli ID di processo per gli ID job in aggiunta alle informazioni normali aggiungi l'opzione -l:
jobs -l
Ecco il risultato:
[1]- 7307 Running find / -iname "*.c" 2> /dev/null > /tmp/output.txt &
[2]+ 7324 Running grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt &
Per visualizzare solo gli ID di processo, digita:
jobs -p
Avrai un risultato simile:
7307
7324
Come faccio a uccidere i jobs in esecuzione in background?
Utilizza il comando kill per uccidere un processo. La sintassi è:
kill PID
kill -15 PID
kill -9 PID
killall nome-processo
killall -15 nome-processo
killall -9 nome-processo
Come faccio a portare in "primo piano" un processo in esecuzione in background?
Vediamo come mandare in foreground un processo che sta girando in background. La sintassi è:
%ID-JOB
oppure
fg ID-JOB
In primo luogo, visualizza l'elenco dei jobs in esecuzione con il comando jobs:
jobs -l
Risultato:
[1]- 7307 Running find / -iname "*.c" 2> /dev/null > /tmp/output.txt &
[2]+ 7324 Running grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt &
Per portare l'ID del processo #2 in foreground, digita:
%2
oppure usa il comando fg
fg 2
Output:
grep -R "hostNamed" / 2> /dev/null > /tmp/grep.txt
Per inviare di nuovo questo job in background premi la combinazione di tasti CTRL+Z cioè tenendo premuto il tasto CTRL, premi il tasto z. Ciò sospende il job in foreground corrente. Digita il seguente comando per inviare di nuovo il job in background:
%2 &
oppure usa il comando bg
bg
Il job del comando grep è adesso avviato in background.
Sintesi di tutti i comandi utili
Descrizione | Comando |
Per vedere quali jobs sono ancora in esecuzione | jobs jobs -l ps aux |
Per mettere un comando/script in background | comando & /percorso/comando & /percorso/script arg1 & |
Per portare un processo da background in foreground | fg n %n |
Per inviare un job in background senza cancellarlo | bg n %n & |
Ricorda: n == id job (usa il comando jobs per vedere l'id del job).