LINUX: Gestione dei processi

()

Gestione dei processi

In ambiente Unix si parla di processo per indicare un programma in esecuzione. Sappiamo che Unix `e un sistema operativo multitasking, ma fino ad ora
abbiamo sfruttato questa caratteristica solo grazie alla multiutenza, che ci  permetteva di “toccare con mano” il fatto che la macchina, avendo pi`u utenti
collegati contemporaneamente, stava effettivamente elaborando più di un  programma.
Per sfruttare pienamente e con comodità il multitasking si deve  disporre di un terminale grafico che ci permetta di aprire sullo schermo pi`u finestre in
cui lanciare contemporaneamente diversi processi in modalit`a  interattiva; `e possibile  fare altrettanto su un normale terminale alfanumerico, ma anche
in questo caso si deve disporre di un programma (ad esempio  screen) che ci consenta di  simulare un ambiente con pi`u finestre. Vedremo in maggiore
dettaglio l’ambiente X Window in seguito, per ora ci limiteremo a  dire che `e possibile lanciare delle applicazioni che lavorano autonomamente ed
indipendentemente dalle altre in una  regione dello schermo (finestra)  riservata ad ognuna di esse.
Per lanciare un’applicazione, come al solito `e necessario dare un comando al prompt della shell, ma cos`ı facendo, come abbiamo visto fino ad ora, non
possiamo utilizzare contemporaneamente sullo stesso terminale un altro programma, almeno fino a quando non saremo usciti dal programma in
esecuzione.
Esiste un modo per sganciare il processo “figlio” (il programma da eseguire) dal processo “padre” (ad esempio la shell da cui si lancia il  programma)
rendendo i due processi indipendenti ed autonomi. Se aggiungiamo il carattere “&” (e commerciale) alla fine della riga che invoca un certo comando, tale
comando sar`a eseguito in una “sessione” separata e quindi potremo utilizzare contemporaneamente la shell (da cui  possiamo nel frattempo lanciare altri
processi) ed il programma che abbiamo lanciato.
Questo `e possibile a patto che il programma “figlio” non richieda una interazione da parte dell’utente mediante il terminale (ad esempio un input da
tastiera, o  una visualizzazione molto “verbosa” di messaggi in output). Vediamo un esempio molto semplice che possiamo provare anche su un normale
terminale alfanumerico.  Il comando yes visualizza una serie di “y” sullo schermo fino a quando non viene interrotto dall’utente.
Interruzione e Sospensione di un programma, Control-c, Control-z
Per interrompere l’esecuzione di un programma dobbiamo battere Ctrl-c (break). Se invece di interromperlo volessimo solo sospenderne temporaneamente l’esecuzione, invece di break dovremmo battere Ctrl-z (stop):
$ yes
y
y
y

(l’utente batte Ctrl-z )
[1]+ Stopped yes
$ _
Il sistema ci informa che il programma identificato dal job number 1, che `e stato lanciato con il comando yes, `e stato momentaneamente interrotto.
Il  comando jobs
jobs ci permette di visualizzare la lista dei processi lanciati da quella shell; nel caso dell’esempio precedente avremmo il seguente output:
$ jobs
[1]+ Stopped yes
$ _
Processi in foreground e in background
In questo momento abbiamo due processi attivi: la shell ed il programma yes che `e momentaneamente interrotto. In particolare diremo che il processo attivo, la shell, `e in foreground, mentre l’altro processo `e in background; in uno stesso momento, nella sessione attiva su un determinato terminale, pu`o esserci  un solo programma in foreground, ma anche molti programmi in background. Per riportare in foreground il programma yes (e mandare quindi in background  la shell) si deve usare il comando fg (foreground) seguito dal numero del job:
$ fg 1
y
y
y
Avevamo citato precedentemente tra le unit`a disponibili su un sistema Unix, anche il device “nullo” /dev/null. Ora potrebbe tornarci utile. E possibile redirigere l’output di una applicazione verso una unit`a diversa dal device di output standard (il video del terminale) mediante l’uso del carattere “>” (maggiore).  Proviamo a redirigere l’output del programma yes verso l’unit`a nulla, dando il comando “yes > /dev/null”. Il programma `e in esecuzione, ma sullo schermo  non appare nulla, neanche il prompt della shell per poter lanciare altri programmi nel frattempo. Interrompiamo l’esecuzione di yes battendo Ctrl-c e proviamo  a riavviarlo con il comando “yes > /dev/null &”:
$ yes > /dev/null &
[1] 143
$ jobs
[1] 143 Running yes >/dev/null &
$ ps
PID TTY STAT TIME COMMAND
67 1 S 1:32 bash
143 1 R 0:02 yes
152 1 R 0:00 ps
$ _
Lista dei job e dei processi attivi, jobs, ps
Con l’aggiunta del simbolo “&” alla fine della linea di comando, abbiamo lanciato l’applicazione in background, mantenendo l’uso della shell per impostare altri comandi. Con il messaggio “[1] 143” il sistema ci comunica che l’applicazione yes `e il primo processo lanciato da questa shell e, nella tabella di tutti i  processi del sistema, gli `e stato assegnato il numero 143 (questo non vuol dire che ci sono 143 processi attivi). Con il comando jobs verifichiamo gli stessi  dati ed in pi`u il sistema ci comunica che l’applicazione `e attualmente in esecuzione (running). Il comando ps ci fornisce delle informazioni su tutti i nostri  processi attivi, non solo quelli lanciati attraverso una certa shell; l’esempio mostra che nel nostro caso sono attivi tre processi, tutti sul terminale tty1: bash, la
shell `e attiva da un’ora e 32 minuti ed `e momentaneamente sospesa (“S”) perch`e sta eseguendo il comando ps, che `e stato appena attivato ed `e in esecuzione (“R”), come pure il programma yes, attivo anche questo solo da qualche istante. Osserviamo infine che con  il comando bg `e possibile riavviare in background un processo precedentemente sospeso con Ctrl-z . Il comando bg accetta come argomento il job id  preceduto dal simbolo di percentuale o il numero del processo.
/ 5
Grazie per aver votato!

How useful was this post?

Click on a star to rate it!

Average rating / 5. Vote count:

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?