Si je démarre un processus et que j'en supprime le binaire, je peux toujours le récupérer à partir de /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
En revanche, si je crée moi-même un lien symbolique, supprimez la cible et essayez de copier:
cp: cannot stat ‘sleep’: No such file or directory
/proc
est une interface vers le noyau. Ce lien symbolique pointe-t-il réellement vers la copie chargée en mémoire, mais avec un nom plus utile? Comment exe
fonctionne exactement le lien?
proc_exe_link()
leproc
système de fichiers: lxr.free-electrons.com/source/fs/proc/base.c?v=4.0#L1350Selon la page de manuel de / proc, sous Linux 2.2 et versions ultérieures, le fichier est un lien symbolique contenant le chemin d'accès réel de la commande exécutée. Apparemment, le binaire est chargé en mémoire et
/proc/[pid]/exe
pointe vers le contenu du binaire en mémoire .D'un autre côté, sous Linux 2.0 et versions antérieures,
/proc/[pid]/exe
est apparemment un pointeur vers le fichier (dans le système de fichiers) qui a été exécuté.Donc, si vous exécutez la même liste de commandes sur Linux 2.0 ou une version antérieure, vous obtiendrez probablement une erreur "aucun fichier ou répertoire".
la source