next up previous contents index
Next: Console Virtuali: essere in Up: Lavorare con Unix Previous: Standard Input e Standard

Multitasking

 

Le basi

 

Il Job control  (controllo dei lavori) 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 far 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 lavori è la shell--tiene traccia dei lavori per voi, 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.



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.gif 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ì:



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 per cancellarlo in modo definitivo, una volta che lo avete sopportato abbastanza.)

Vediamo in dettaglio il messaggio lasciato dalla shell:



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ì:



 

Il messaggio che il job è sospeso è ingannevole. Per vedere se è ancora in vita (cioè in esecuzione o in stato sospeso), digitate jobs :



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ì:



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 indietro il prompt.



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  :



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 fb e bg:



Ecco, è andato. Adesso avviamo un po' di job in contemporanea, così:



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 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 pò 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ì:



Come abbiamo appena dimostrato, fg prende anche i parametri che cominciano con %. In effetti, potevate anche digitare:



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:



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:



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:



Adesso sono entrambi sospesi (perché li avete sospesi con ), 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:



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:



Dovreste vedere vari messaggi sulla terminazione dei job--nessuno muore tranquillamente, sembra. La Figura gif 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.

Cosa sta succedendo veramente?

 

È importante capire che il controllo dei job viene fatto dalla shell. Non esiste nel sistema un programma fg; piuttosto fg, bg, &, jobs e kill sono tutti comandi interni alla shell (qualche volta kill è un programma indipendente, ma la shell bash usata da Linux ce l'ha interno). Questo è un modo logico di procedere: siccome ogni utente ha il proprio spazio per il controllo dei job, e ogni utente ha già la sua shell, è più semplice far controllare i job dell'utente alla shell. Quindi, ogni numero di job di un utente si riferisce soltanto a quell'utente: il mio job numero [1] e il tuo job numero [1] sono due processi totalmente differenti. In effetti, se siete loggati più di una volta, ogni vostra shell avrà dati diversi per controllare i job, così ogni utente può avere due job diversi con lo stesso numero in due shell diverse.

Il modo per riferirsi in modo sicuro ad un processo è mediante il numero di identificazione di processo, o Process ID (PID). Questo numero viene assegnato dal sistema--ogni processo ha un PID univoco. Due utenti diversi possono riferirsi ad un processo mediante il suo PID e sapere che si stanno riferendo allo stesso processo (assumendo che siano loggati nella stessa macchina!).

Diamo un'occhiata ad un altro comando per capite cosa sono i PID. Il comando ps elenca tutti i processi in esecuzione, compresa la vostra shell. Provate. Ha anche alcune opzioni: le più importanti (secondo molti) sono a, u e x. L'opzione a elencherà i processi di tutti gli utenti, non solo i vostri. L'opzione x mostrerà i processi che non hanno un terminale associato.gif Infine, l'opzione u dà ulteriori informazioni sui processi, che spesso sono utili.

Per avere davvero un'idea di cosa sta facendo il sistema, mettete insieme tutte le opzioni: ps -aux. Potete vedere i processi che usano più memoria guardando la colonna %MEM, e più tempo di CPU sulla colonna %CPU. (La colonna TIME elenca il tempo totale di CPU usato.)tempo di CPU

Un'altra nota veloce sui PID. kill, oltre ad accettare le opzioni nella forma %numero-job, accetta direttamente anche i PID. Così, mettete yes > /dev/null in background, eseguite ps e cercate yes. Quindi digitate kill PID.gif

Se iniziate a programmare in C nel vostro sistema Linux, imparerete che il controllo dei job della shell è soltanto una versione interattiva delle chiamate fork e execl. È troppo complesso da vedere qui, ma potrebbe essere utile ricordarlo più avanti quando dovrete programmare e vorrete eseguire processi multipli di un singolo programma.


next up previous contents index
Next: Console Virtuali: essere in Up: Lavorare con Unix Previous: Standard Input e Standard


Fri Sep 19 00:41:53 CEST 1997