Indietro Indice Home PHC Avanti


I processi: avvio, genealogia

Quando si accende un computer esso carica ed esegue il kernel, e quando questo è stato caricato, tra le altre cose che fa, come montare la partizione di root, esegue il primo processo, di solito /sbin/init. Si può specificare anche in fase di boot (dal prompt del LILO) quale programma utilizzare all'avvio, con l'opzione init=/path/programma, cosa molto utile se la linux box ha qualche problema di troppo...

Tutti gli altri processi sono fatti nascere, indirettamente o direttamente, da init.

Ogni processo viene identificato dal kernel tramite un PID, assegnato al momento dell'esecuzione del programma, e una serie di altre informazioni. I PID vengono assegnati in ordine crescente, quindi init ha sempre PID=1.

In un sistema Linux tutti i processi nascono tramite una fork(), che non fa altro che duplicare il processo e far eseguire quello duplicato da dopo la chiamata. Se si vuole che un processo esegua un programma si utilizza una fork(), e si fa in modo che il processo duplicato chiami una exec, che di fatto sostituisce il programma corrente con quello da eseguire.

Con questo sistema ogni processo ha un padre, il processo che lo ha generato, e dei figli, i processi che ha generato, di conseguenza tutti i processi sono discendenti di init (potevano chiamarlo adamo...)

Sapere le parentele è abbastanza utile (lo vedremo meglio nelle prossime sezioni), perché spesso se termina un processo terminano tutti i suoi figli (se i figli sopravvivono diventano orfani)(sto parlando seriamente). Per vedere le parentele tra processi esistono i comandi pstree e ps. Vediamo alcuni esempi:

[messina@poisson seminario $] pstree -p
init(1)-+-apache(325)-+-apache(28691)
        |             |-apache(28692)
        |             |-apache(28693)
        |             |-apache(28694)
        |             |-apache(28856)
        |             |-apache(16085)
        |             |-apache(11497)
        |             `-apache(28943)
        |-automount(260)
        |-automount(273)
        |-automount(284)
        |-cron(320)
        |-getty(2370)
        |-gpm(184)
        |-icmplogd(191)
        |-inetd(163)
        |-kdm(341)-+-XF86_S3(1478)
        |          `-kdm(2479)
        |-kerneld(40)
        |-kflushd(2)
        |-klogd(151)
        |-kswapd(3)
        |-nfsiod(292)
        |-nfsiod(293)
        |-nfsiod(294)
        |-nfsiod(295)
        |-portmap(161)
        |-rpc.mountd(303)
        |-rpc.nfsd(300)
        |-rpc.rstatd(310)
        |-rpc.rusersd(312)
        |-rpc.rwalld(308)
        |-rwhod(315)
        |-sshd(204)---sshd(3287)---bash(3291)-+-emacs(3315)
        |                                     |-pstree(3341)
        |                                     `-xdvi.bin.real(3316)
        |-syslogd(149)
        |-timeseal(327)
        |-update(20)
        |-ypbind(175)---ypbind(176)-+-ypbind(177)
        |                           `-ypbind(178)
        `-ypserv(171)
[messina@poisson seminario $]

L'opzione `-p' stampa accanto ad un processo il suo PID. Se aggiungiamo anche il nome di un utente verrà stampato solo l'albero dei processi di quell'utente. L'altro comando è più prolisso...


[messina@poisson seminario $] ps axufwwww
USER       PID %CPU %MEM  SIZE   RSS TTY STAT START   TIME COMMAND
daemon     161  0.0  0.4   816   316  ?  S   Feb 17   0:00 /sbin/portmap 
nobody     308  0.0  0.5   860   344  ?  S   Feb 17   0:00 /usr/sbin/rpc.rwalld 
root         1  0.0  0.5   776   320  ?  S   Feb 17   0:04 init 
root        20  0.0  0.1   728   120  ?  S   Feb 17   0:03 update 
root        40  0.0  0.3   748   244  ?  S   Feb 17   0:00 /sbin/kerneld 
root       149  0.0  0.8   980   548  ?  S   Feb 17   0:42 /sbin/syslogd 
root       151  0.0  0.6   864   392  ?  S   Feb 17   0:13 /sbin/klogd 
root       163  0.0  0.6   852   392  ?  S   Feb 17   0:00 /usr/sbin/inetd 
root       175  0.0  0.5  1032   332  ?  S   Feb 17   0:01 /usr/sbin/ypbind 
root       184  0.0  0.3   772   232  ?  S   Feb 17   0:00 /usr/sbin/gpm -m /dev/ttyS0 -t msc 
root       204  0.0  0.7  1312   492  ?  S   Feb 17   1:23 /usr/sbin/sshd -q 
root      3287  1.7  2.3  1900  1468  ?  S    08:21   0:22  \_ /usr/sbin/sshd -q 
messina   3291  0.0  2.1  1984  1380  p0 S    08:21   0:00      \_ -bash 
messina   3315  1.8  8.1  6616  5156  p0 S    08:25   0:19          \_ emacs processi.tex 
messina   3347  0.0  0.9   964   628  p0 R    08:42   0:00          \_ ps axufwwww 
root       300  0.0  1.0  1296   672  ?  S   Feb 17   0:41 /usr/sbin/rpc.nfsd 
root       303  0.0  0.8  1224   564  ?  S   Feb 17   0:00 /usr/sbin/rpc.mountd 
root       310  0.0  0.3   768   204  ?  S   Feb 17   0:00 /usr/sbin/rpc.rstatd 
root       312  0.0  0.4   792   256  ?  S   Feb 17   0:00 /usr/sbin/rpc.rusersd 
root       325  0.0  1.5  2108   960  ?  S   Feb 17   0:00 /usr/sbin/apache 
www-data 11497  0.0  1.5  2204  1016  ?  S   Feb 27   0:09  \_ /usr/sbin/apache 
root       341  0.0  2.6  5300  1652  ?  S   Feb 17   0:24 /usr/bin/X11/kdm 
root      1478  0.4  8.1  9184  5200  ?  S   Feb 18  80:28  \_ /usr/bin/X11/X vt11 
root      2479  0.0  4.3  5472  2768  ?  S    17:53   0:00  \_ -:0              
root      2370  0.0  0.7   892   508   1 S    17:25   0:00 /sbin/getty 38400 tty1 
[messina@poisson seminario $]


Antonio Messina
2000-03-17