Multitasking: background e foreground
Il Job control (controllo dei job) si riferisce alla possibilità di mettere i processi (essenzialmente la stessa cosa
dei programmi) in background (sullo sfondo) e di riportarli in foreground (in primo piano), cioè poter eseguire
un processo mentre voi state facendo qualcos'altro, ma mantenendone il controllo per potergli comunicare qualcosa o per poterlo fermare.
In Unix, lo strumento principale per controllare i job è la shell: tiene traccia dei job per conto vostro, se imparate il suo
linguaggio.
Le due parole più importanti in questo linguaggio sono fg, per "foreground", e bg, per "background".
Per vedere come funzionano, usiamo il comando yes al prompt.
/home/larry$ yes
Questo comando ha lo strano effetto di creare una lunga colonna di y nel bordo sinistro dello schermo, più veloce
di quello che riuscite a vedere. Ci sono delle buone ragioni per l'esistenza di questo strano comando. Talvolta i comandi chiedono conferma,
cioè chiedono di rispondere "yes" a delle domande. Il comando yes permette di automatizzare la risposta
a queste domande. Per fermare il comando, normalmente dovete premere + ,
ma questa volta premete + .
Sembra che si sia fermato, e viene stampato un messaggio prima del prompt più o meno così:
[1]+ Stopped yes
Significa che il processo yes è stato sospeso in background. Potete farlo ripartire nuovamente con il comando
fg al prompt, che lo riporterà in primo piano. Se volete, potete fare altro prima, mentre è sospeso. Provate
alcuni ls o altro prima di rimetterlo in foreground. Una volta ritornato in foreground, ricominceranno le y ,
veloci come prima. Non dovete preoccuparvi che il programma "immagazzini" delle y mentre il job è sospeso:
quando un programma è sospeso, l'intero programma non viene più eseguito finché non lo fate ritornare in vita (e
ora potete premere +
per cancellarlo in modo definitivo, una volta che lo avete sopportato abbastanza).
Vediamo in dettaglio il messaggio lasciato dalla shell:
[1]+ Stopped yes
Il numero tra parentesi è il numero del job di questo processo, e sarà usato quando dovrete riferirvi in modo
specifico a quel job (naturalmente, siccome il controllo dei job riguarda l'esecuzione di più processi, è necessario un
metodo per distinguerli l'uno dall'altro). Il carattere + che segue le parentesi comunica che quello è il "job corrente",
cioè il job spostato per ultimo dal foreground al background.
Se scrivete fg , metterete in foreground il job marcato con il + (ne parleremo ancora più avanti, quando parleremo
dell'esecuzione di più job contemporaneamente). La parola Stopped significa che il job è sospeso: il job
non è morto, ma non è più in esecuzione; Linux lo ha salvato in uno speciale stato di sospensione, pronto a tornare
in azione appena qualcuno lo richieda. Infine, yes è il nome del processo che è stato fermato.
Prima di proseguire, cancelliamo questo job ed avviamolo in modo diverso. Il comando si chiama kill e può essere
usato così:
/home/larry$ kill %1
[1]+ Stopped yes
Il messaggio che il job è sospeso è ingannevole. Per vedere se è ancora in vita (cioè in esecuzione o in
stato sospeso), digitate jobs :
/home/larry$ jobs
[1]+ Terminated yes
Ecco qui! Il job è stato terminato! È possibile che jobs non restituisca niente, per indicare che non ci sono jobs in
esecuzione in background). Se avete appena cancellato un job, e digitando jobs non viene mostrato nulla, allora la cancellazione è
stata compiuta con successo. Normalmente viene comunicato che il job è stato "terminato" (terminated) o "ucciso"
(killed). Adesso avviamo yes nuovamente, così:
/home/larry$ yes > /dev/null
Se avete letto la sezione sulla redirezione dell'input e dell'output, saprete che questo sta mandando l'output di yes
nel file speciale /dev/null . /dev/null è un buco nero che assorbe ogni output che gli si manda (potete
immaginare che il flusso di y finisca fuori dal computer e scompaia in un buco nel muro, se questo vi rende più
contenti). Dopo aver digitato questo comando, non otterrete indietro il prompt, ma non vedrete nemmeno la colonna di y .
Anche se l'output viene mandato a /dev/null , il job è ugualmente in esecuzione in foreground. Come al solito, potete
sospendere il job premendo + ;
fatelo adesso per ottenere di nuovo il prompt.
[1]+ Stopped yes >/dev/null
/home/larry$
Hmm... c'è un modo per far sì che esso funzioni in background, così da lasciarci il prompt per altri lavori interattivi?
Il comando da usare è bg :
/home/larry$ bg
[1]+ yes >/dev/null &
/home/larry$
Adesso dovete avere fiducia in me: dopo che avete inserito bg , yes > /dev/null è tornato a funzionare
nuovamente, ma questa volta in background. Infatti, se fate qualcosa al prompt, come ls e simili, noterete che la macchina
è leggermente rallentata (convogliare un continuo flusso di caratteri richiede comunque del lavoro!). Oltre a questo, comunque,
non ci sono altri effetti. Potete fare qualsiasi cosa vogliate al prompt, e yes continuerà a mandare il suo output
nel buco nero.
Ci sono adesso due modi diversi per cancellarlo: con il comando kill che avete appena imparato, o rimettendo il job in
foreground e premendo il tasto di interruzione( +
). Proviamo il secondo metodo, solo per capire meglio le relazioni tra fg e bg:
/home/larry$ fg
yes >/dev/null
[adesso e' nuovamente in foreground. Immaginiamo che io abbia premuto ctrl+c per terminarlo]
/home/larry$
Ecco, è andato.
|