paseando por /proc


En este post vamos a darnos un paseillo por el sistema de archivos /proc. Desde siempre me había intrigrado la cantidad de datos extraños que hay debajo de /proc, así que vamos a dar una vuelta!

Supongamos que tenemos un linux, que está ejecutando una bbdd Oracle. Oracle arranca unos cuantos procesos: para escribir los logs, listener, escribir datos a datafile, monitorizar otros procesos …

[root@box /]# ps aux | grep -i oracle
oracle 3920 0.0 0.1 65304 9876 ? Ssl Jul18 0:00 /opt/oracle/product/10.2.0/db/bin/tnslsnr LISTENER -inherit
oracle 3978 0.0 0.2 1641684 17144 ? Ss Jul18 0:00 ora_pmon_SID
oracle 3980 0.0 0.1 1640508 15408 ? Ss Jul18 0:00 ora_psp0_SID
oracle 3982 0.0 0.4 1640508 40768 ? Ss Jul18 0:00 ora_mman_SID
oracle 3984 0.0 6.5 1665924 535984 ? Ss Jul18 0:11 ora_dbw0_SID
oracle 3986 0.0 0.3 1656068 31744 ? Ss Jul18 0:41 ora_lgwr_SID
oracle 3988 0.0 0.6 1642116 49300 ? Ss Jul18 0:54 ora_ckpt_SID
oracle 3990 0.0 2.1 1643228 177576 ? Ss Jul18 0:22 ora_smon_SID
oracle 3992 0.0 0.2 1640564 22420 ? Ss Jul18 0:00 ora_reco_SID
oracle 3994 0.0 0.7 1642200 63436 ? Ss Jul18 0:10 ora_cjq0_SID
oracle 3996 0.0 0.9 1643352 76596 ? Ss Jul18 0:04 ora_mmon_SID
oracle 3998 0.0 0.3 1640552 25452 ? Ss Jul18 0:00 ora_mmnl_SID
oracle 4000 0.0 0.1 1641388 15560 ? Ss Jul18 0:00 ora_d000_SID
oracle 4002 0.0 0.1 1641560 14792 ? Ss Jul18 0:00 ora_s000_SID
oracle 4006 0.0 0.2 1640516 16692 ? Ss Jul18 0:00 ora_qmnc_SID
oracle 4949 0.0 0.2 1640560 18436 ? Ss Jul18 0:00 ora_q000_SID
oracle 4951 0.0 0.1 1640540 16048 ? Ss Jul18 0:00 ora_q001_SID
oracle 5052 0.0 0.3 1641228 28808 ? Ss Jul18 0:06 oracleSID (LOCAL=NO)
oracle 10251 0.0 0.3 1640704 27508 ? Ss 11:56 0:00 oracleSID (LOCAL=NO)
root 10358 0.0 0.0 52160 808 pts/0 R+ 12:53 0:00 grep -i oracle
[root@box /]#

¿Realmente oracle necesita todos esos procesos? Vamos a fijarnos en uno, el listener.

[root@box /]# pidof tnslsnr
3920

Asi que tiene PID 3920 … vamos al directorio /proc.


[root@box ~]# cd /proc/
[root@box proc]# ls
t1 11981 140 6397 6909 dri misc
10 11983 1893 6404 6910 driver modules
10081 11984 2 6439 7 execdomains mounts
1126 11990 3 6448 7124 fb mtrr
11421 11994 3313 6469 781 filesystems net
11794 12005 3459 6470 807 fs partitions
11862 12021 4 6471 9 ide scsi
11876 12030 4025 6472 95 interrupts self
11892 12038 4559 6473 9890 iomem slabinfo
11894 12066 5 6474 acpi ioports stat
11900 12677 5428 6489 asound irq swaps
11926 12679 5648 6491 buddyinfo kallsyms sys
11929 1293 5654 6531 bus kcore sysrq-trigger
11930 13147 5983 6552 cmdline keys sysvipc
(...)
3920
(...)

Parece que hay un subdirectorio por cada proceso. Veamos qué podemos averiguar de nuestro listener.

[root@box proc]# cd 3920/
[root@box 3920]# pwd
/proc/3920
[root@box 3920]# ls
attr cwd loginuid mountstats seccomp status
auxv environ maps oom_adj smaps task
cmdline exe mem oom_score stat wchan
cpuset fd mounts root statm

Hay bastante información relativa al proceso del listener, por ejemplo:

  • “cmdline” representa la línea de comandos con la que se ha arrancado el proceso. En /proc hay otro cmdline, pero ese representa las opciones que se han pasado al kernel para arrancar.
  • “cwd” es el directorio en el que está el proceso.
  • “environ” las variables del entorno de ese proceso. Lo mismo que veríamos con la opción “-e” de ps
  • “exe” el ejecutable del proceso, en este caso es un enlace simblico a /opt/oracle/product/10.2.0/db/bin/tnslsnr
  • “root” sería el directorio raíz según ese proceso. Puede ser útil para comprobar si un servicio que hemos instalado se está ejecutando en chroot o no.
  • “fd” son los descriptores de archivo que está accediendo el proceso. Como en Unix todo son archivos esto significa que podemos ver qué ficheros está leyendo/escribiendo, sockets, pipes. sería algo parecido a lo que hace el comando “lsof”

Además de estos valores de procesos, dentro de proc hay más archivos para ver o consultar otras cosas como:

  • si las interfaces de red han de hacer “forwarding”
  • particiones montadas
  • sistemas de archivos reconocidos por el kernel
  • tiempo arrancado (uptime)

Vale la pena explorar un poco por /proc, es bastante posible que algunas funciones que necesitamos incluir en un script se puedan hacer accediendo directamente a /proc en vez de ejecutar y parsear la salida de algun comando.

2 Responses to “paseando por /proc”

  1. Hola.

    Tu blog es muy interesante y contiene mucha información.

    ¿Puedo hacerte una pregunta sobre Linux un poco off-topic? ¿Conoces los Linux para equipos de bajos recursos como Puppy Linux?

    Saludos. Llegué del blog de JM viendo por qué alimentas a los trolls🙂

  2. Gracias Darío …

    nah, el blog lo tengo para calmar mis tardes de sabado cuando me entra la frikinosis😄

    Estuve jugando con algunas mini, no recuerdo exactamente para qué, pero me parece que estuve probando a remasterizarla pero no recuerdo para qué exactamente. supongo que me entraría la neura con meterla en algun lao (la distro!!).

    Por si te sirve de algo, hace algunos años estuve intentando meter una linux en un portatil 486 con 4Mb de RAM; y despues de mil intentos la que se dejó meter fue una slackware. Mas que nada porque tb había la dificultad añadida de que la unidad de CDROM era externa y por puerto paralelo (ja!!). Slackware se dejaba parametrizar más el arranque, pero fue un infierno de todas maneras xD

    No te puedo ayudar mucho más con las minis, sorry!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: