Keywords: guide

Next: Cosa sta succedendo veramente? Up: Multitasking Previous: Multitasking

## Le basi

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