Quando un comando impiega parecchio tempo (una compressione, una copia grossa, un download) il terminale resta bloccato finché non finisce. Ma la shell ci permette di mandare i comandi in background, di recuperarli in foreground e di tenere sotto controllo tutto da un solo terminale. È utilissimo soprattutto in SSH, dove i terminali a disposizione sono pochi.
Un comando che dura: sleep
Per le prove ci basta sleep, che fa semplicemente dormire il terminale per un certo numero di secondi. Con un tempo breve:
sleep 5
Passato il tempo il terminale torna interattivo.
Mandare in background con la E commerciale
Aggiungendo alla fine del comando il simbolo &, la shell lo lancia in background e ci restituisce subito il prompt:
sleep 20 &
La shell stampa il numero del job in background. Nel frattempo possiamo continuare a usare il terminale normalmente. Quando il comando finisce, la shell ci avvisa con un messaggio del tipo “Completato sleep 20”.
Sospendere un comando già lanciato: Ctrl+Z E bg
E se lanciamo un comando lungo e ci accorgiamo solo dopo che ci serve il terminale? Lanciamo, per esempio:
sleep 60
Premiamo Ctrl+Z: il comando viene sospeso (messo in pausa). A questo punto con il comando bg lo mandiamo in background e la sua esecuzione riprende, mentre il terminale resta libero:
bg
Vedere i job: jobs
Possiamo lanciare più comandi in background:
sleep 60 &
sleep 80 &
sleep 120 &
Per vedere la coda dei job con il loro stato usiamo jobs:
jobs
Ripetendolo otteniamo la lista sempre aggiornata, e possiamo monitorare cosa si è concluso e cosa no.
Tornare in foreground: fg
Se vogliamo riportare un job in primo piano usiamo fg seguito dall’identificativo del job, quello che compare fra parentesi quadre nell’output di jobs. Per riportare in foreground il terzo, quello da 120 secondi:
fg %3
Ora il terminale è di nuovo bloccato perché sta eseguendo quel comando, e dobbiamo aspettare che finisca oppure rimandarlo in background con Ctrl+Z seguito da bg. Immagina che invece di uno sleep sia una copia di file: possiamo controllarne lo stato e poi rimandare tutto in background se c’è ancora molto da aspettare.
In sintesi
- comando &: lancia direttamente in background;
- Ctrl+Z: sospende il comando in corso;
- bg: manda in background un job sospeso;
- jobs: elenca i job e il loro stato;
- fg: riporta un job in foreground.
Man mano che i job finiscono la shell ci avvisa, e con un po’ di pratica si gestiscono tante operazioni lunghe da un unico terminale.
Link e risorse
- il video su YouTube
- esempi e comandi della puntata su GitHub
- Controllo dei job in Bash — il manuale GNU
- Comandi built-in per i job — jobs, bg, fg, disown
- bash(1) — la man page completa
- sleep(1)
Sostieni il canale
PER SOSTENERE IL CANALE BASTANO UN LIKE E UN’ISCRIZIONE!
questi link sono affiliati Amazon, acquistando i libri che ti consiglio sostieni il canale!
