El sistema de archivos /proc es algo específico de GNU/Linux. El mismo es un sistema de archivos virtual, y como tal, no ocupa lugar en su disco. Este es una forma muy conveniente de obtener información sobre el sistema, ya que la mayoría de los archivos de este directorio son legibles (bueno, con un poco de ayuda). De hecho, muchos programas obtienen información de los archivos de /proc, la formatean a su manera y luego la muestran. Este es el caso de todos los programas que muestran información sobre los procesos, y ya hemos visto algunos de ellos (top, ps y otros). /proc también es una buena fuente de información sobre su hardware, y similarmente, unos cuantos programas solo son las interfaces de la información contenida en /proc.
También hay un sub-directorio especial, /proc/sys. Este permite cambiar algunos parámetros del núcleo en tiempo real o consultarlos.
Si Ud. lista el contenido del directorio /proc, verá muchos directorios cuyo nombre es un número. Estos son los directorios que contienen información sobre todos los procesos que están corriendo en el sistema en ese momento:
$ ls -d /proc/[0-9]* /proc/1/ /proc/302/ /proc/451/ /proc/496/ /proc/556/ /proc/633/ /proc/127/ /proc/317/ /proc/452/ /proc/497/ /proc/557/ /proc/718/ /proc/2/ /proc/339/ /proc/453/ /proc/5/ /proc/558/ /proc/755/ /proc/250/ /proc/385/ /proc/454/ /proc/501/ /proc/559/ /proc/760/ /proc/260/ /proc/4/ /proc/455/ /proc/504/ /proc/565/ /proc/761/ /proc/275/ /proc/402/ /proc/463/ /proc/505/ /proc/569/ /proc/769/ /proc/290/ /proc/433/ /proc/487/ /proc/509/ /proc/594/ /proc/774/ /proc/3/ /proc/450/ /proc/491/ /proc/554/ /proc/595/ |
Note que como usuario no privilegiado, Ud. (lógicamente) solo puede mostrar la información relacionada con sus propios procesos, pero no con los de los otros usuarios. Entonces, seamos root y veamos que información está disponible del proceso 127:
$ su Password: $ cd /proc/127 $ ls -l total 0 -r--r--r-- 1 root root 0 dic 14 19:53 cmdline lrwx------ 1 root root 0 dic 14 19:53 cwd -> // -r-------- 1 root root 0 dic 14 19:53 environ lrwx------ 1 root root 0 dic 14 19:53 exe -> /usr/sbin/apmd* dr-x------ 2 root root 0 dic 14 19:53 fd/ pr--r--r-- 1 root root 0 dic 14 19:53 maps| -rw------- 1 root root 0 dic 14 19:53 mem lrwx------ 1 root root 0 dic 14 19:53 root -> // -r--r--r-- 1 root root 0 dic 14 19:53 stat -r--r--r-- 1 root root 0 dic 14 19:53 statm -r--r--r-- 1 root root 0 dic 14 19:53 status $ |
Cada directorio contiene las mismas entradas. Aquí tiene una descripción breve de algunas de ellas:
cmdline Este (pseudo-)archivo contiene toda la línea de comandos usada para invocar al proceso. No tiene formato: no hay un espacio entre el programa y sus argumentos, y tampoco hay un salto de línea al final.
cwd Este vínculo simbólico apunta al directorio de trabajo corriente ("current working directory" en inglés, de allí el nombre) del proceso.
environ Este archivo contiene todas las variables de entorno definidas por este proceso, de la forma siguiente: VARIABLE=valor. Similarmente a cmdline, la salida no tiene formato alguno: no hay saltos de línea para separar las diferentes variables, y tampoco al final.
exe Este es un vínculo simbólico que apunta al archivo ejecutable correspondiente al proceso en curso de ejecución.
fd Este sub-directorio contiene la lista de los" descriptores" de archivo abiertos actualmente por el proceso. Vea abajo.
maps Cuando Ud. muestra el contenido de esta tubería nombrada (por ejemplo, con cat), Ud. puede ver las partes del espacio de direccionamiento del proceso que en ese momento están proyectadas sobre un archivo. Los campos, de izquierda a derecha, son: el espacio de direccionamiento asociado a esta proyección, los permisos asociados a esta proyección, el desplazamiento desde el comienzo del archivo donde comienza la proyección, el dispositivo en el cual se encuentra el archivo proyectado, el número de i-nodo del archivo, y finalmente el nombre del archivo en sí mismo. Vea man 2 mmap.
root Este es un vínculo simbólico que apunta al directorio raíz usado por el proceso. Generalmente, será /, pero vea man 2 chroot.
status Este archivo contiene información diversa sobre el proceso: el nombre del ejecutable, su estado corriente su PID y su PPID, sus UID y GID reales y efectivos, su uso de memoria, y otras.
Si listamos el contenido del directorio fd, obtenemos lo siguiente:
$ ls -l fd total 0 lrwx------ 1 root root 64 dic 16 22:04 0 -> /dev/console l-wx------ 1 root root 64 dic 16 22:04 1 -> pipe:[128] l-wx------ 1 root root 64 dic 16 22:04 2 -> pipe:[129] l-wx------ 1 root root 64 dic 16 22:04 21 -> pipe:[130] lrwx------ 1 root root 64 dic 16 22:04 3 -> /dev/apm_bios lr-x------ 1 root root 64 dic 16 22:04 7 -> pipe:[130] lrwx------ 1 root root 64 dic 16 22:04 9 -> /dev/console $ |
De hecho, esta es la lista de los descriptores de archivo que abrió el proceso. Cada descriptor abierto está materializado por un vínculo simbólico cuyo nombre es el número del descriptor, y que apunta al archivo abierto por este descriptor[1]. Ud. también puede notar los permisos sobre los vínculos simbólicos: este es el único lugar donde los derechos tienen sentido, ya que representan los permisos con los cuales se abrió el archivo correspondiente al descriptor.
[1] | Si Ud. recuerda lo que se dijo en la sección Redirecciones y tuberías, Ud. sabrá el significado de los descriptores 0, 1 y 2. |