Controllo dei lavori

Home |

Precedente | Contenuto | Successivo

Nella lezione precedente, abbiamo visto alcune delle implicazioni di Linux come sistema operativo multiutente. In questa lezione, esamineremo la natura multitasking di Linux, e come viene controllata con l’interfaccia della linea di comando.

Come ogni sistema operativo multitasking, Linux esegue processi multipli e simultanei. Beh, sembrano simultanei, comunque. In realtà, il core di un singolo processore può eseguire solo un processo alla volta, ma il kernel di Linux riesce a dare ad ogni processo il suo turno al processore e ognuno sembra essere in esecuzione nello stesso momento.

Ci sono diversi comandi che vengono usati per controllare i processi. Essi sono:

  • ps – elencare i processi in esecuzione sul sistema
  • kill – inviare un segnale a uno o più processi (solitamente per “uccidere” un processo)
  • jobs – un modo alternativo di elencare i propri processi
  • bg – mettere un processo in background
  • fg – mettere un processo in primo piano

Un esempio pratico

Mentre può sembrare che questo argomento sia piuttosto oscuro, può essere molto pratico per l’utente medio che lavora principalmente con l’interfaccia grafica. Anche se potrebbe non essere evidente, la maggior parte (se non tutti) i programmi grafici possono essere lanciati dalla linea di comando. Ecco un esempio: c’è un piccolo programma fornito con il sistema X Window chiamato xload che mostra un grafico che rappresenta il carico del sistema. Possiamo eseguire questo programma digitando quanto segue:

$ xload

Notare che la piccola finestra xload appare e comincia a mostrare il grafico del carico di sistema. Sui sistemi in cui xload non è disponibile, provate invece gedit. Notate anche che il nostro prompt non è riapparso dopo il lancio del programma. La shell sta aspettando che il programma finisca prima che il controllo ritorni. Se chiudiamo la finestra xload, il programma xload termina e il prompt ritorna.

Mettere un programma in secondo piano

Ora, per rendere la vita un po’ più facile, lanceremo nuovamente il programma xload, ma questa volta lo metteremo in secondo piano in modo che il prompt torni. Per fare questo, eseguiamo xload in questo modo:

$ xload & 1223$

In questo caso, il prompt ritorna perché il processo è stato messo in secondo piano.

Ora immaginate che abbiamo dimenticato di usare il simbolo “&” per mettere il programma in secondo piano. C’è ancora speranza. Possiamo digitare Ctrl-z e il processo sarà sospeso. Possiamo verificarlo vedendo che la finestra del programma è congelata. Il processo esiste ancora, ma è inattivo. Per riprendere il processo in background, digitate il comando bg (abbreviazione dibackground). Ecco un esempio:

$ xload+ Stopped xload$ bg+ xload &

Listing Running Processes

Ora che abbiamo un processo in background, sarebbe utile visualizzare una lista dei processi che abbiamo lanciato. Per farlo, possiamo usare il comandojobs o il più potente comando ps.

$ jobs+ Esecuzione di xload&$ psPID TTY TIME CMD1211 pts/4 00:00:00 bash1246 pts/4 00:00:00 xload1247 pts/4 00:00:00 ps$

Uccidere un processo

Supponiamo di avere un programma che non risponde; come ce ne liberiamo? Usiamo il comando kill, naturalmente. Proviamolo su xload. Per prima cosa, dobbiamo identificare il processo che vogliamo uccidere. Possiamo usare jobs o ps per farlo. Se usiamo lavori otterremo un numero di lavoro. Con ps, ci viene dato un id di processo (PID). Lo faremo siaways:

$ xload & 1292$ jobs+ Running xload&$ kill %1$ xload & 1293 Terminated xload$ psPID TTY TIME CMD1280 pts/5 00:00:00 bash1293 pts/5 00:00:00 xload1294 pts/5 00:00:00 ps$ kill 1293+ Terminato xload$

Un po’ di più su kill

Mentre il comando kill è usato per “uccidere” i processi, il suo vero scopo è di inviare segnali ai processi. La maggior parte delle volte il segnale ha lo scopo di dire al processo di andarsene, ma c’è molto di più. I programmi (se sono scritti correttamente) ascoltano i segnali dal sistema operativo e rispondono ad essi, il più delle volte per permettere un metodo di terminazione più o meno razionale. Per esempio, un editor di testo potrebbe ascoltare qualsiasi segnale che indichi che l’utente si sta scollegando, o che il computer si sta spegnendo. Quando riceve questo segnale, potrebbe salvare il lavoro in corso prima di uscire. Il comando kill può inviare una varietà di segnali ai processi. Digitando:

kill -l

verrà stampato un elenco dei segnali che supporta. Molti sono piuttosto oscuri, ma alcuni sono utili da conoscere:

Segnale # Nome Descrizione
1 SIGHUP Segnale di sospensione. I programmi possono ascoltare questo segnale e agire di conseguenza. Questo segnale viene inviato ai processi in esecuzione in un terminale quando si chiude il terminale.
2 SIGINT Segnale di interruzione. Questo segnale viene dato ai processi per interromperli. I programmi possono elaborare questo segnale e agire su di esso. Possiamo anche emettere questo segnale direttamente digitando Ctrl-c nella finestra del terminale dove il programma è in esecuzione.
15 SIGTERM Segnale di terminazione. Questo segnale viene dato ai processi per terminarli. Di nuovo, i programmi possono elaborare questo segnale e agire di conseguenza. Questo è il segnale predefinito inviato dal comando kill se non viene specificato alcun segnale.
9 SIGKILL Segnale di uccisione. Questo segnale causa la terminazione immediata del processo da parte del kernel Linux. I programmi non possono ascoltare questo segnale.

Ora supponiamo di avere un programma che è irrimediabilmente bloccato e vogliamo liberarcene. Ecco cosa facciamo:

  1. Utilizzate il comando ps per ottenere l’id del processo (PID) del processo che vogliamo terminare.
  2. Fate un comando kill per quel PID.
  3. Se il processo rifiuta di terminare (cioè, sta ignorando il segnale), invia segnali sempre più duri finché non termina.
$ ps x | grep bad_programPID TTY STAT TIME COMMAND2931 pts/5 SN 0:00 bad_program$ kill -SIGTERM 2931$ kill -SIGKILL 2931

Nell’esempio precedente abbiamo usato il comando ps con l’opzione x per elencare tutti i nostri processi (anche quelli non lanciati dal terminale corrente). Inoltre, abbiamo convogliato l’output del comando ps in grep per elencare solo il programma che ci interessa. Successivamente, abbiamo usato kill per inviare un segnale SIGTERM al programma problematico.Nella pratica, è più comune farlo nel modo seguente, poiché il segnale predefinito inviato da kill è SIGTERM e kill può anche usare il numero del segnale invece del nome del segnale:

$ kill 2931

Poi, se il processo non termina, forzarlo con il segnale SIGKILL:

$ kill -9 2931

Ecco!

Questo conclude la serie di lezioni “Imparare la Shell”. Nella prossima serie, “Scrivere script della Shell”, vedremo come automatizzare i compiti con la shell.

Altre letture

  • Per un trattamento più approfondito dell’argomento, vedere il capitolo 10 in La linea di comando di Linux.
  • 1963 Timesharing: A Solution to Computer Bottlenecks, un affascinante video di YouTube del Computer History Museum che descrive il primo sistema operativo di timesharing e come funziona. È fondamentalmente lo stesso metodo usato da tutti i computer moderni.
Top | Previous | Contents | Next

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.