Next: Cosa sta succedendo veramente?
Up: Multitasking
Previous: Multitasking
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.
81#81
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.6.5
Per
fermare il comando, normalmente dovete premere
82#82, ma questa volta premete
83#83. Sembra che si sia fermato, e viene stampato un
messaggio
prima del prompt più o meno così:
84#84
Significa che il processo yes è stato sospeso 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
82#82 per cancellarlo
in
modo definitivo, una volta che lo avete sopportato abbastanza).
Vediamo in dettaglio il messaggio lasciato dalla shell:
85#85
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ì:
86#86
Il messaggio che il job è sospeso è ingannevole. Per vedere se è
ancora in vita (cioè in esecuzione o in stato sospeso), digitate jobs :
87#87
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ì:
88#88
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
83#83; fatelo adesso per
ottenere di nuovo il prompt.
89#89
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 :
90#90
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 (
82#82). Proviamo il secondo
metodo, solo per capire meglio le relazioni tra fb e bg:
91#91
Ecco, è andato. Adesso avviamo un po' di job in contemporanea, così:
92#92
La prima cosa che dovreste notare di questi comandi è il simbolo &
alla fine delle prime due righe . Mettere un & dopo un
comando comunica alla shell di avviarlo fin dall'inizio in background
(è soltanto un modo per evitare di dover avviare il
programma, premere
93#93 e digitare bg). Così abbiamo avviato
questi due comandi in background. Il terzo, attualmente, è sospeso e
inattivo. Potreste notare come adesso la macchina sia diventata un po' più
lenta, in quanto ci sono due processi in esecuzione che richiedono un
po' di tempo CPU.
Ogni processo vi ha comunicato il suo numero di job. I primi due
hanno mostrato
anche il loro numero di Process IDentification Process IDentification ,
o PID, subito dopo il numero del job. Normalmente non è
necessario conoscere il PID dei processi, ma qualche volta può
tornare
utile.
Eliminiamo il secondo processo, dato che può rallentare la
macchina. Potrei semplicemente scrivere kill %2, ma sarebbe troppo
semplice. Invece, facciamo così:
94#94
Come abbiamo appena dimostrato, fg prende anche i parametri
che cominciano
con %. In effetti, potevate anche digitare:
95#95
Questo funziona perché la shell interpreta automaticamente un numero di job
come una richiesta di mettere quel job in foreground. È possibile
distinguere un numero di job da altri numeri anteponendo %. Adesso
digitiamo jobs per vedere quali job sono ancora in esecuzione:
96#96
Il ``-'' significa che il job numero 1 è il secondo job
pronto ad essere messo in foreground, se digitate fg senza dare nessun
altro parametro. Il ``+'' significa che il job in questione è
il primo della lista--un fg senza parametri porterà in primo
piano il job numero 3.
Comunque potete farlo anche tramite il suo numero, se
volete:
97#97
Essere passati al job numero 1 ed averlo sospeso ha anche cambiato la
priorità
di tutti i vostri job. Potete vederlo con il comando jobs:
98#98
Adesso sono entrambi sospesi (perché li avete sospesi con
99#99), e il job 1 è il prossimo job che viene messo in foreground
per default; questo perché avete lo avete messo in foreground manualmente, e
successivamente sospeso. Il ``+'' si riferisce sempre al job
più recente
che è stato sospeso dal foreground. Potete rimetterlo in esecuzione di
nuovo:
100#100
Notate che adesso è in esecuzione, e l'altro job è tornato
indietro nell'elenco ed ha il +.
Ora eliminiamo tutti questi job per poter
usare meglio la macchina:
101#101
Dovreste vedere vari messaggi sulla terminazione dei job--nessuno muore
tranquillamente, sembra.
La Figura fa un breve riassunto di tutto
quello
che dovreste sapere sul controllo dei job:
Figure:
Riassunto dei comandi e dei tasti usati nel controllo dei
job.
102#102 |
Next: Cosa sta succedendo veramente?
Up: Multitasking
Previous: Multitasking
Eugenia Franzoni
1998-09-29