ePrometeusCorsoLinuxLinux
testi articoli
Testi Articoli  Download
Home | OpenSource | PhpNuke | Programming | SysAdm | 
CorsoJava è ora Video! Free for all!
Clicca Qui!
FONDAMENTI DI LINUX
Linux: tutto quello che...
Cominciamo...
Utenti e permessi
Processi e segnali
Compressione e archiviazione
Bibliografia


<<< Processi e segnali >>>

Linux è un sistema operativo multitasking. Questo significa che molti processi possono essere in esecuzione contemporaneamente. La “contemporaneità” è, quando abbiamo un solo processore, in realtà simulata alternando frequentemente l’esecuzione dei vari processi. Il multitasking è molto importante per Internet, in quanto un server deve appunto rispondere contemporaneamente alle molteplici richieste che arrivano. E infatti quando un sistema Linux viene avviato, partono alcuni processi, detti demoni, che rimangono in background a servire le richieste degli utenti. Con il comando ps possiamo esaminare i processi in esecuzione al momento. Senza alcun parametro questo comando mostra i processi in esecuzione per l’utente che lo ha invocato. I parametri di ps variano abbastanza tra le varie versioni di Linux. Ecco un esempio (parziale) dell’output ottenibile con Linux:


$ ps ax
 PID TTY STAT  TIME COMMAND
    1  ?  S    0:02 init [3]
    2  ?  SW   0:00 (kflushd)
    3  ?  SW<  0:00 (kswapd)
  105  ?  S    0:01 klogd
  116  ?  S    0:00 crond
  128  ?  S    0:00 inetd
  139  ?  S    0:00 lpd
  167  ?  S    0:00 httpd
  179  ?  S    0:00 smbd -D
  188  ?  S    0:00 nmbd -D
  202   2 S    0:00 /sbin/mingetty tty2
  208  ?  S    0:00 update (bdflush)
  274  ?  S    0:02 in.telnetd
  465  ?  S    0:00 bash
  714  ?  R    0:00 ps ax

Possiamo notare i vari processi in esecuzione al momento. Per ogni processo viene mostrato il pid (process identifier), un numero unico che viene assegnato dal sistema per identificare univocamente ogni processo, il terminale su cui gira, lo stato (SWapped, Suspended o Running). Notiamo che il processo di pid 1 è init, che è il processo che parte per primo e si occupa di avviare tutto il resto. Sono in esecuzione anche diversi demoni, che hanno per convenzione un nome terminante in d. Per esempio crond è il demone che manda in esecuzione dei programmi in determinati intervalli di tempo, inetd è l’Internet super demone che si occupa di mandare in esecuzione altri demoni quando ce n’è necessità. Nell’esempio ci siamo connessi via telnet, ed è inetd che ha mandato in esecuzione in.telnetd, il demone che ci consente la connessione telnet. Altri demoni interessanti sono l’httpd, ovvero il Web Server che rende la macchina un membro a pieno titolo del World Wide Web, il Samba (smbd e nmbd), che rendono il nostro Linux un file server per Windows e così via. Nel nostro esempio, dopo che ci siamo collegati via telnet, è partita una shell, la bash, dalla quale abbiamo invocato il comando ps che ha generato l’output.

Saper far partire i demoni è molto importante quando si amministra un sistema Linux. Il più delle volte è una cosa semplicissima: basta eseguire il programma, che si sdoppia in due parti: una rimane residente e l’altra termina, restituendoci il prompt; è il caso del name server named: basta invocarlo, si sdoppia e attiva il demone (una parte termina e ci restituisce il prompt, l’altra rimane a servere le richieste). Altri programmi funzionano in modo analogo ma hanno bisogno di qualche switch supplementare. Per esempio, il demone della posta elettronica, il sendmail (che, solita eccezione, non ha un nome che termina con d), per sdoppiarsi e diventare un demone deve essere invocato come sendmail -bd. Altri programmi semplicemente non si sdoppiano, e vanno resi dei processi di background con un comando di shell. Per esempio, il demone del Mini SQL va attivato con msqld &. La ‘&’ comunica alla shell di sdoppiare essa stessa il comando e di mandarlo in esecuzione in background.

C’è una connessione tra i processi e i permessi. Un processo ha i permessi dell’utente che li ha lanciati. Se mi loggo come utente pippo, non riuscirò per esempio a far partire il demone della posta, il sendmail. Infatti questo programma deve smistare la posta che arriva ai vari utenti, e quindi deve poter scrivere in tutte le mailbox di tutti gli utenti. D’altra parte le mailbox degli utenti non possono essere leggibili a tutti (per ovvie ragioni di sicurezza) quindi il sendmail deve avere i permessi di root. Per questa ragione solo root può attivare certi demoni. Altri demoni possono essere attivati dagli utenti, come gli httpd che possono anche essere fatti partire da un utente qualsiasi.

Talvolta è necessario comunicare con un demone, il più delle volte per farlo terminare. Questa operazione viene effettuata utilizzando il comando kill, che in realtà non serve genericamente ad “uccidere” un processo (anche se è l’uso più frequente) ma a inviare un segnale. Linux ha decine di segnali diversi, che possono essere elencati utilizzando il comando kill stesso:


$ kill -l [output parziale]
 1) SIGHUP       
 2) SIGINT       
 3) SIGQUIT      
 9) SIGKILL     
 10) SIGUSR1     
 11) SIGSEGV     
 12) SIGUSR2
 14) SIGALRM     
 15) SIGTERM     

La lista effettiva varia da sistema a sistema, questi sono i segnali più comuni tra i vari Linux. Il comando kill richiede il pid del processo a cui si vuole inviare un segnale, e il segnale, che se non specificato è SIGTERM. Per convenzione questo è il segnale che viene utilizzato dai processi per “terminarli”, ma non è detto che un processo impazzito risponda. Allora si ricorre al segnale numero 9, SIGKILL, che è l’unico che non può essere intercettato, e infatti è il vero modo di “ammazzare” in maniera sicura un processo andato in tilt è kill -9 <pid>. Volendo, si può anche scrivere kill -KILL <pid> in quanto i nomi dei segnali possono essere dati per nome.

Generalmente si utilizza kill quando si cambia la configurazione di un demone e lo si deve fare ripartire. Infatti i demoni leggono la configurazione solo all’avvio. Se per esempio se cambio la configurazione dell’httpd, magari per creare un nuovo server virtuale, per attivare la nuova configurazione devo prima terminare il demone e poi farlo ripartire.

Ci sono altri usi dei segnali, non necessariamente letali: infatti in generale si tratta di una primitiva di comunicazione con i processi. Per esempiosupponiamo di cambiare la configurazione del nameserver, named. Per rileggere la configurazione possiamo semplicemente terminare il processo e riavviarlo, ma c’è, in questo caso, un modo più semplice: il segnale HUP, che viene intercettato dal named senza terminare e lo forza a rileggere la configurazione. Quindi, dopo aver editato le configurazioni, basta kill  HUP <pid> (dove <pid> è il pid del named che va trovato con ps) per aggiornare la configurazione. Questo sistema di “riavvio” incruento dei demoni funziona con molti altri demoni (per esempio init), ma non con tutti: molti httpd non supportano questo metodo; vanno esplicitamente terminati e riavviati.


ePrometeus s.r.l. - Web Software House & Open Source System Integrator
MILANO - SAN BENEDETTO DEL TRONTO(AP)
Contatti: info@eprometeus.com