Indietro | Indice | Home PHC | Avanti |
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 $]