PREV
Capitolo 10 - Gestire Files e Directory
|
NEXT
Capitolo 12 - Strumenti di Amministrazione Essenziali
|
-
Capitolo 11. Controllo dei Processi
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
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:
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:
Adesso il processo sospeso lavorerà
in background.
top
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:
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:
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
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
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:
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:
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 è:
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:
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
è:
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
C'è un comando che puoi usare per vedere informazioni
sui processi del tuo sistema che si aggiornano automaticamente. Questo
comando è top e parte dando:
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
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
PREV
Capitolo 10 - Gestire Files e Directory
|
NEXT
Capitolo 12 - Strumenti di Amministrazione Essenziali
|