GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿en qué se diferencia el enlace simbólico /proc//exe de los enlaces simbólicos ordinarios?

Si inicio un proceso y luego elimino el binario, todavía puedo recuperarlo desde /proc/<pid>/exe :

$ cp `which sleep` .
$ ./sleep 10m &
[1] 13728
$ rm sleep
$ readlink /proc/13728/exe                           
/tmp/sleep (deleted)
$ cp /proc/13728/exe ./sleep-copy
$ diff sleep-copy `which sleep` && echo not different
not different
$ stat /proc/13728/exe 
  File: ‘/proc/13728/exe’ -> ‘/tmp/sleep (deleted)’
  Size: 0           Blocks: 0          IO Block: 1024   symbolic link

Por otro lado, si yo mismo hago un enlace simbólico, elimino el destino e intento copiar:

cp: cannot stat ‘sleep’: No such file or directory

/proc es una interfaz para el núcleo. Entonces, ¿este enlace simbólico realmente apunta a la copia cargada en la memoria, pero con un nombre más útil? ¿Cómo funciona el exe enlace funciona, exactamente?

Respuesta aceptada:

/proc/<pid>/exe no sigue la semántica normal de los enlaces simbólicos. Técnicamente, esto podría contar como una violación de POSIX, pero /proc es un sistema de archivos especial después de todo.

/proc/<pid>/exe parece ser un enlace simbólico cuando stat eso. Esta es una forma conveniente para que el kernel exporte el nombre de ruta que conoce para el ejecutable del proceso. Pero cuando realmente abre ese "archivo", no existe el procedimiento normal de leer el siguiente contenido de un enlace simbólico. En su lugar, el kernel solo le da acceso a la entrada del archivo abierto directamente.

Tenga en cuenta que cuando ls -l un /proc/<pid>/exe pseudoarchivo para un proceso cuyo ejecutable ha sido eliminado, el destino del enlace simbólico tiene la cadena "(eliminado)" al final. Esto normalmente no tendría sentido en un enlace simbólico:definitivamente no hay un archivo que viva en la ruta de destino con un nombre que termine con "(eliminado)".

tl;dr El proc La implementación del sistema de archivos simplemente hace su propia magia con la resolución de nombres de ruta.


Linux
  1. Cómo mapear dispositivos /dev/sdX y /dev/mapper/mpathY desde el dispositivo /dev/dm-Z

  2. /proc/[pid]/pagemaps y /proc/[pid]/maps | linux

  3. ¿Cómo obtener la cantidad de CPU/núcleos en Linux desde la línea de comandos?

  4. ¿Por qué en algunos sistemas Linux, el sistema de archivos raíz aparece como /dev/root en lugar de /dev/<nodo de dispositivo real> en mtab?

  5. ¿Deberían vivir los sitios web en /var/ o /usr/ según el uso recomendado?

Linux – ¿Fusionar /usr/bin y /usr/sbin en /bin (gnu/linux)?

Archivos /proc/cpuinfo y /proc/meminfo en Linux

Comprender los archivos /proc/mounts, /etc/mtab y /proc/partitions

¿Cómo obtengo la ruta de un proceso en Unix/Linux?

¿Cuándo debo usar /dev/shm/ y cuándo debo usar /tmp/?

¿Cómo saber desde qué carpeta se está ejecutando un proceso?