PREV
Capitolo 10 - Gestire Files e Directory
NEXT
Capitolo 12 - Strumenti di Amministrazione Essenziali

Torna all'indice

Capitolo 11. Controllo dei Processi

Ogni programma è un processo. Questi processi variano dall'X Window ai programmi di sistema (i demoni) che partono all'avvio del computer.
Ogni processo lavora come un particolare utente. I processi che sono partiti durante il boot generalmente lavorano come root o nobody.
I processi che avvii tu, lavorano come se fossero te. I processi avviati da altri utenti lavorano come questi utenti.

Hai il controllo  su tutti i processi che hai avviato. Inoltre, l'utente root ha il controllo su tutti i processi del sistema, inclusi quelli avviati da altri utenti. I processi possono essere controllati e monitorati con diversi programmi come molti comandi shell.

top
Torna all'indice

Backgrounding


I programmi avviati dalla linea di comando partono in foreground. Questo ti permette di vedere tutto l'output del programma ed interaggire con esso. Comunque, in molte occasioni vorresti che il programma lavori senza occupare il tuo terminale.  Questo è chiamato "far girare il programma in background" e ci sono alcuni modi per farlo.

Il primo modo per mettere in background un processo è di aggiungere un & al comando quando avvi il programma.  Per esempio, metti che vuoi usare il player mp3 amp  in riga di comando per ascoltare una directory piena di mp3, ma hai bisogno di fare altro sullo stesso terminale. Il seguente comando fà partire amp in background:


$ amp *.mp3 &

Il programma lavorerà normalmente e tu ritornerai al prompt.

L'altro modo è invece far partire il programma. Quando si avvia dare control+z. Questo sospende il processo. Un processo sospeso è un processo in pausa. Momentaneamente smette di girare e può essere fatto ripartire nuovamente in ogni momento. Una volta sospeso  un processo, ritorni al prompt.  Puoi mandare in background il processo dando:

   $ bg 


 
Adesso il processo sospeso lavorerà  in background.

top
Torna all'indice

Foregrounding


Se hai bisogno di intereggire con il programma in background, tu portarlo in foreground. Se hai un solo processo messo in  background, puoi portarlo indietro dando:

   $ fg

Se il programma non ha finito di lavorare, prenderà il controlo del tuo terminale e non ritornerai al prompt. Altrimenti, cioè se ha finito, avrai un messaggio simile a questo:

   $ [1]+  Done              /bin/ls $LS_OPTIONS                                          

Questo dice che  il tuo processo in background  (in questo caso ls , non molto interessante) ha finito.

A volte  è  possibile avere molti processi in background. Quando questo accade, avrai bisogno di sapere quale processo portare in foreground. Dando fg ritornerà in foreground l'ultimo processo  messo in background.  E se hai una lista di processi in background? Fortunatamente, la bash include un comando che dà la lista di tali processi.
E' chiamato jobs  e dà un output simile a:

   $ jobs
[1] Stopped vim
[2]- Stopped amp
[3]+ Stopped man ps

Mostra quindi la lista dei processi che hai in background. Come vedi sono tutti "stopped". Questo vuol dire che sono sospesi. Il numero è una sorta di ID per tutti i processi in background. L'ID con un segno + indica il processo che tornerà in foreground se dai fg.
Se vuoi portare in foregrounf vim , devi dare:

    $ fg 1 

e  vim tornerà alla console.  La tecnica del backgrounding è utile se hai un solo terminale aperto su una connessione dialup. Puoi avere molti processi che lavorano su un solo terminale e periodicamente passare dall'uno all'altro.

top
Torna all'indice

ps


Adesso sai come passare da un programma all'altro su un singolo terminale. Sai che molti processi girano allo stesso tempo. E come puoi avere una lista di tali processi? Bene, dovrai utilizzare il comando ps. Questo comando ha molte istruzioni e per questo tratteremo le più importanti. Per la lista completa, vedi la pagina di man per ps. Le pagine man sono trattate in dettaglio nella sezione chiamata man nel Capitolo 2.

Semplicemente dando ps avrai una lista dei processi avviati sul tuo terminale. Molte volte,  sarà una lista molto corta:

  $ ps
PID TTY TIME CMD
7923 ttyp0 00:00:00 bash
8059 ttyp0 00:00:00 ps

Anche se non sono molti processi, l'informazione è molto frequente.  Non importa quanti processi stanno girando, avrai le stesse colonne con ps. Tutto questo cosa significa?

Bene, il PID è l'ID del processo. A tutti i processi che lavorano è dato un identificatore unico. Sui kernel 2.2.x, l'ID di un processo può variare da 1 a 32767. Ad ogni processo è assegnato il prossimo PID libero. Quando un processo viene chiuso ( o killato come vedremo nel prossimo paragrafo), lascia libero il suo PID. Quando il PID massimo è vicino, il prossimo libero punterà al PID più piccolo libero. Questo cambia con la venuta dei kernel 2.4 e l'introduzione dei PID a 32-bit.

La colonna TTY indica su quale terminale stanno girando i processi. Se ps darà una lista di processi che girano tutti sul terminale corrente, allora tutti i processi daranno la stessa informazione nella colonne TTY.  Come puoi vedere, entrambi i processi mostrati stanno su ttyp0. Questo indica che stanno girando remotamente o su un terminale X.

La colonna TIME indica quanto tempo di CPU il processo ha impiegato per partire. Questo è differente dal valore di tempo di un processo. Ricorda che Linux è un
sistema operativo multitasking. Ci sono molti processi che lavorano tutti allo stesso tempo, e questi processi impegnano una piccola porzione del tempo della CPU. Cosi, la colonna TIME  mostra il tempo che  è stato impegnato da ogni processo per partire. Se noti  diversi minuti nella colonna TIME,  vuol dire che qualcosa non va.

Finalmente, la colonna CMD. Essa mostra il nome del programma attuale, no i singoli comandi o le singole inforamazioni. Per avere queste informazioni, hai bisogno di  passare a ps diverse opzioni. Ne discuteremo brevemente.

Puoi avere una completa lista dei processi che girano sul tuo sistema usando le giuste combinazioni di opzioni. Questa sarà probabilmente lunga ( 55 sul mio laptop con il quale sto scrivendo), così taglierò un pò l'output:


   $ ps -ax
PID TTY STAT TIME COMMAND
1 ? S 0:03 init [3]
2 ? SW 0:13 [kflushd]
3 ? SW 0:14 [kupdate]
4 ? SW 0:00 [kpiod]
5 ? SW 0:17 [kswapd]
11 ? S 0:00 /sbin/kerneld
30 ? SW 0:01 [cardmgr]
50 ? S 0:00 /sbin/rpc.portmap
54 ? S 0:00 /usr/sbin/syslogd
57 ? S 0:00 /usr/sbin/klogd -c 3
59 ? S 0:00 /usr/sbin/inetd
61 ? S 0:04 /usr/local/sbin/sshd
63 ? S 0:00 /usr/sbin/rpc.mountd
65 ? S 0:00 /usr/sbin/rpc.nfsd
67 ? S 0:00 /usr/sbin/crond -l10
69 ? S 0:00 /usr/sbin/atd -b 15 -l 1
77 ? S 0:00 /usr/sbin/apmd
79 ? S 0:01 gpm -m /dev/mouse -t ps2
94 ? S 0:00 /usr/sbin/automount /auto file /etc/auto.misc
106 tty1 S 0:08 -bash
108 tty3 SW 0:00 [agetty]
109 tty4 SW 0:00 [agetty]
110 tty5 SW 0:00 [agetty]
111 tty6 SW 0:00 [agetty]

[output cut]

Molti di questi processi partondo durante la fase di boot del sistema. Io ho fatto qualche modifica al mio sistema, per questo il tuo può risultare diverso. Comunque, vedrai molti processi che girano sul tuo sistema. Come vedi,vengono visualizzate anche  le opzioni dei comandi. Ma ci sono  altre colonne e  altri interessanti output.

Primo, noterai che molti processi lavorano sulla tty "?". Questi sono processi che sono stati avviati da un terminale non a lungo attivo. Quindi non sono stati associati ad un terminale a lungo.

Secondo, c'è una nuova colonna: STAT. Questa mostra lo stato di un processo. "S" sta per "sleeping": il processo sta aspettando che accada qualcosa. "Z" sta per "zombied" . Ovvero il processo "padre" è morto e ha lasciato i suoi "figli". Questa non è una bella cosa.

Se vuoi vedere  ancora più informazioni, prova:


   $ ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 344 80 ? S Mar02 0:03 init [3]
root 2 0.0 0.0 0 0 ? SW Mar02 0:13 [kflushd]
root 3 0.0 0.0 0 0 ? SW Mar02 0:14 [kupdate]
root 4 0.0 0.0 0 0 ? SW Mar02 0:00 [kpiod]
root 5 0.0 0.0 0 0 ? SW Mar02 0:17 [kswapd]
root 11 0.0 0.0 1044 44 ? S Mar02 0:00 /sbin/kerneld
root 30 0.0 0.0 1160 0 ? SW Mar02 0:01 [cardmgr]
bin 50 0.0 0.0 1076 120 ? S Mar02 0:00 /sbin/rpc.port
root 54 0.0 0.1 1360 192 ? S Mar02 0:00 /usr/sbin/sysl
root 57 0.0 0.1 1276 152 ? S Mar02 0:00 /usr/sbin/klog
root 59 0.0 0.0 1332 60 ? S Mar02 0:00 /usr/sbin/inet
root 61 0.0 0.2 1540 312 ? S Mar02 0:04 /usr/local/sbi
root 63 0.0 0.0 1796 72 ? S Mar02 0:00 /usr/sbin/rpc.
root 65 0.0 0.0 1812 68 ? S Mar02 0:00 /usr/sbin/rpc.
root 67 0.0 0.2 1172 260 ? S Mar02 0:00 /usr/sbin/cron
root 77 0.0 0.2 1048 316 ? S Mar02 0:00 /usr/sbin/apmd
root 79 0.0 0.1 1100 152 ? S Mar02 0:01 gpm
root 94 0.0 0.2 1396 280 ? S Mar02 0:00 /usr/sbin/auto
chris 106 0.0 0.5 1820 680 tty1 S Mar02 0:08 -bash
root 108 0.0 0.0 1048 0 tty3 SW Mar02 0:00 [agetty]
root 109 0.0 0.0 1048 0 tty4 SW Mar02 0:00 [agetty]
root 110 0.0 0.0 1048 0 tty5 SW Mar02 0:00 [agetty]
root 111 0.0 0.0 1048 0 tty6 SW Mar02 0:00 [agetty]

[output cut]

L'informazione è massima. In genere aggiunge informazioni come l'utente che ha avviato il processo, quante risorse di sistema sta occupando ( le colonne %CPU, %MEM, VSZ, RSS) e la data in cui il processo è partito. Ovviamente, ci sono molte informazioni utili per l'amministratore del sistema. Ma sorge un altro problema: a volte le righe sono molte e non si riesce a vederle per via che vanno fuori il lato dello schermo. L'opzione -w risolve il problema. 

Non è carino, ma svolge bene il suo lavoro. Adesso sai come avere la lista completa dei processi e le informazioni su di esse. Leggi attentamente le pagine di man per ps per riuscire ad ottenere ancora più informazioni. Comunque le opzioni che abbiamo mostrato sono le più comuni e sono quelle che userai più spesso.

top
Torna all'indice

kill

Nel  caso in cui dei programmi iniziano a comportarsi male e hai bisogno di riportarli in riga puoi usare, per questo tipo di amministrazione,  kill il quale, inoltre, può essere usato per manipolare i processi in molti modi. L'uso più comune di kill  è il killare (uccidere) un processo. Hai bisogno di farlo quando il programma lavora ma usa molte rsorse del sistema oppure se tu sei disgustato del suo girare.

Per killare un processo, hai bisogno di conoscere il suo PID oppure il suo nome. Per conoscere il PID, usa il comando ps, come discusso nel preedente paragafo. Per esempio per killare il processo 4747, devi usare:


   $ kill 4747

Nota che devi esserne il proprietario per killarlo. Questa è feature di sicurezza. Se tu potessi killare i processi di altri utenti, potrebbe essere possibile fare ogni sorta di attacco. Naturalmente, l'utente root può killare ogni tipo di porcesso sul sistema.

C'è un altro modo per killare. Il programma killall il quale fa esattamente quello che dice: killa tutti i processi che hanno un certo nome. Se vuoi killare tutti i processi vim, puoi usare:

   $ killall vim

Così tutti i processi vim verranno chiusi. Facendo questo l'utente root può chiudere tutti i processi vim degli utenti. Un modo interessante per cacciare fuori dal sistema tutti gli utenti compreso se stessi è:

   # killall bash

A volte un semplice kill non basta per chiudere un processo. Allora hai bisogno di usare un metodo più potente. Se ad esempio il PID 4747 non risponde alla tua richiesta di kill, puoi usare:

   $ kill -9 4747
 
Con  questo il  processo  certamente si chiuderà.  Puoi fare la  stessa cosa con killall.  Manderà  un  differente segnale al processo.  Un  kill semplice  manda un segnale   SIGTERM (termina)  al processo.  kill -9  manda invece  un segnale SIGKILL (killa) al  processo. Per avere una lista di questi segnali :

   $ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR

I numeri devono essere usati per kill, per killall  si possono usare i nomi meno il "SIG". Un altro esempio è:

   $ killall -KILL vim

Un altro modo di usare kill è per riavviare un processo. Mandando un segnale SIGHUP, i processi rileggeranno i loro file di configurazione. Questo è molto utile per dire ai processi di sistema di rileggere i loro file di config dopo che questi sono stati modificati.

top
Torna all'indice

top

C'è un comando che puoi usare per vedere informazioni sui processi del tuo sistema che si aggiornano automaticamente. Questo comando è top e parte dando:

   $ top
 

Mostrerà a pieno schermo tutte le informazioni  sui processi che stanno girando sul sistema,  come  carico medio,  numeri di processi,  stato della CPU,  memoria libera,  e  dettagli circa  i processi come  PID,  utente, priorità,  occupazione della CPU e della memoria , tempo  di  lavoro  e il nome.

Figura 11-1. Esempio di output del comando


E' chiamato top perchè il programma che usa di più la CPU è mostrato per primo in alto. Una nota interessante è che top mostrerà prima i processi che stanno usand di più la cpu. Comunque, top è molto utile per determinare quale programma sta lavorando male e ha bisogno di essere killato.

top
Torna all'indice

Sommario

In questo capitolo si è parlato su cosa è un processo e come controllarlo. Questo include il backgrounding e il foregrounding, usando ps, top, e kill. Dovresti adesso in grado di determinare quali processi stanno girando sul tuo sistema e conoscere come sbarazzartene se  iniziano a dare strane anomalie.

top
Torna all'indice

PREV
Capitolo 10 - Gestire Files e Directory
NEXT
Capitolo 12 - Strumenti di Amministrazione Essenziali