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