|
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.
|