|
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.
|