Información sobre procesos en /proc

por | mayo 26, 2016

Una de las ventajas de los sistemas de ficheros virtuales como procfs es que permiten acceder a valiosa información de procesos que están cargados en memoria. En el caso de la partición /proc, echemos un vistazo inicial (he recortado en parte el output):

[root@debianbob]:/proc/1542# ls /proc/
1     1196  16	  42	5206  798	   fs
10    12    168   4270	53    799	   interrupts
1027  121   169   429	5313  8		   iomem
1030  1215  17	  43	5321  8003	   ioports
1031  122   170   430	54    806	   irq
1034  123   18	  4327	55    830	   kallsyms
1038  1232  191   4359	56    857	   kcore
1041  1233  192   4360	58    859	   keys
1048  1234  2	  4361	5838  866	   key-users
1052  1254  20	  4374	59    867	   kmsg
1058  1279  21	  4375	60    8805	   kpagecount
1081  1297  22	  4376	6031  9		   kpageflags
1083  13    224   4397	648   908	   loadavg
1085  130   23	  4405	653   9119	   locks
1094  131   237   4420	656   9121	   meminfo
1099  1315  242   4424	659   9175	   misc
11    1319  25	  4425	66    950	   modules
1103  132   26	  4426	661   953	   mounts
1107  1320  27	  4446	662   967	   mtrr
...

Centrémonos en los números. Son directorios y representan en cada caso el PID de un proceso. De hecho, el 1 corresponde a init, aunque yo quiero tomar como base el 1542 que es del navegador Iceweasel:

[root@debianbob]:~# cd /proc/1542
[root@debianbob]:/proc/1542# ls -l
total 0
dr-xr-xr-x  2 bob bob 0 May 26 19:30 attr
-rw-r--r--  1 bob bob 0 May 26 19:30 autogroup
-r--------  1 bob bob 0 May 26 19:30 auxv
-r--r--r--  1 bob bob 0 May 26 17:49 cgroup
--w-------  1 bob bob 0 May 26 19:30 clear_refs
-r--r--r--  1 bob bob 0 May 26 17:49 cmdline
-rw-r--r--  1 bob bob 0 May 26 17:49 comm
-rw-r--r--  1 bob bob 0 May 26 19:30 coredump_filter
-r--r--r--  1 bob bob 0 May 26 19:30 cpuset
lrwxrwxrwx  1 bob bob 0 May 26 19:30 cwd -> /home/bob
-r--------  1 bob bob 0 May 26 19:30 environ
lrwxrwxrwx  1 bob bob 0 May 26 17:49 exe -> /usr/lib/iceweasel/iceweasel
dr-x------  2 bob bob 0 May 26 17:49 fd
dr-x------  2 bob bob 0 May 26 19:30 fdinfo
-rw-r--r--  1 bob bob 0 May 26 19:30 gid_map
-r--------  1 bob bob 0 May 26 19:30 io
-r--r--r--  1 bob bob 0 May 26 19:30 limits
...

Aquí encontramos gran cantidad de ficheros y directorios de los que podemos extraer valiosa información. En el directorio fd por ejemplo, tendremos una lista de los descriptores de ficheros (file descriptors) que abiertos por el proceso (sockets UNIX, pipes, librerías…):

...
lrwx------ 1 bob bob 64 May 26 19:33 69 -> socket:[17235]
lrwx------ 1 bob bob 64 May 26 19:33 66 -> /home/bob/.mozilla/firefox/s22time0.default-1462299246715/places.sqlite-wal
lr-x------ 1 bob bob 64 May 26 19:33 65 -> /home/bob/.mozilla/firefox/s22time0.default-1462299246715/places.sqlite
lrwx------ 1 bob bob 64 May 26 19:33 64 -> socket:[41550]
lrwx------ 1 bob bob 64 May 26 19:33 63 -> /home/bob/.mozilla/firefox/s22time0.default-1462299246715/places.sqlite-wal
lr-x------ 1 bob bob 64 May 26 19:33 62 -> /home/bob/.mozilla/firefox/s22time0.default-1462299246715/places.sqlite
lrwx------ 1 bob bob 64 May 26 19:33 61 -> socket:[17234]
…

En el fichero limits tenemos los valores de límite del sistema aplicados a este proceso en concreto: cuántos descriptores de fichero puede abrir, procesos asociados, prioridad de ejecución…

[root@debianbob]:/proc/1542# cat limits 
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            8388608              unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             63850                63850                processes 
Max open files            65536                65536                files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       63850                63850                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us        

En el fichero io encontramos estadísticas de I/O del proceso:

[root@debianbob]:/proc/1542# cat io 
rchar: 3055920085
wchar: 35878834231
syscr: 1249592
syscw: 2937245
read_bytes: 143790080
write_bytes: 2009534464
cancelled_write_bytes: 125702144

¿Información del estado del proceso? Fácil, también tenemos el fichero status que nos proporciona información sobre el nombre, estado, PID, PPID, hilos (threads) abiertos, memoria virtual…:

[root@debianbob]:/proc/1542# cat status 
Name:	iceweasel
State:	S (sleeping)
Tgid:	1542
Ngid:	0
Pid:	1542
PPid:	1140
TracerPid:	0
Uid:	1000	1000	1000	1000
Gid:	1000	1000	1000	1000
FDSize:	256
Groups:	24 25 29 30 44 46 108 1000 
VmPeak:	 3290984 kB
VmSize:	 2825188 kB
VmLck:	       0 kB
VmPin:	       0 kB
VmHWM:	 1400664 kB
VmRSS:	 1137264 kB
VmData:	 2060724 kB
VmStk:	     928 kB
VmExe:	     108 kB
VmLib:	  144728 kB
VmPTE:	    4368 kB
VmSwap:	       0 kB
Threads:	107
SigQ:	0/63850
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	0000000000000000
SigIgn:	0000000001001000
SigCgt:	0000002f820044af
CapInh:	0000000000000000
CapPrm:	0000000000000000
CapEff:	0000000000000000
CapBnd:	0000003fffffffff
Seccomp:	0
Cpus_allowed:	ff
Cpus_allowed_list:	0-7
Mems_allowed:	00000000,00000001
Mems_allowed_list:	0
voluntary_ctxt_switches:	3723908
nonvoluntary_ctxt_switches:	30966

En los ficheros oom* encontramos valores relativos al comportamiento que tomará el OOM Killer en caso de tener que matar procesos y la prioridad que dará a este (en una escala de 0 a 1000, menor número significa menor prioridad del kernel para matar este proceso):

[root@debianbob]:/proc/1542# ls oom_*
oom_adj  oom_score  oom_score_adj

Si cerrara el navegador Iceweasel, el proceso 1542 desaparecería y también el correspondiente directorio 1542 que lo representa en /proc.

Hemos visto cómo podemos acceder fácilmente a gran cantidad de información que puede resultar de gran ayuda para conocer las tuercas del sistema y los procesos que subyacen. Para más documentación (y muy bien detallada por cierto) como siempre man es nuestro amigo → man proc