Como o link simbólico / proc / <pid> / exe difere dos links simbólicos comuns?

23

Se eu iniciar um processo e excluir o binário dele, ainda posso recuperá-lo 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

Por outro lado, se eu mesmo criar um link simbólico, exclua o destino e tente copiar:

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

/procé uma interface para o kernel. Então, esse link simbólico realmente aponta para a cópia carregada na memória, mas com um nome mais útil? Como o exelink funciona exatamente?

muru
fonte

Respostas:

19

/proc/<pid>/exenão segue a semântica normal para links simbólicos. Tecnicamente, isso pode ser considerado uma violação do POSIX, mas /procafinal é um sistema de arquivos especial.

/proc/<pid>/exeparece ser um link simbólico quando você stat. Essa é uma maneira conveniente para o kernel exportar o nome do caminho que conhece para o executável do processo. Mas quando você realmente abre esse "arquivo", não existe o procedimento normal de ler o seguinte conteúdo de um link simbólico. Em vez disso, o kernel apenas fornece acesso diretamente à entrada do arquivo aberto.

Observe que, quando você cria ls -lum /proc/<pid>/exepseudofile para um processo cujo executável foi excluído, o destino do link simbólico tem a sequência "(excluída)" no final. Normalmente, isso não seria sensato em um link simbólico: definitivamente não existe um arquivo que viva no caminho de destino com um nome que termine com "(excluído)".

tl; dr A procimplementação do sistema de arquivos faz sua própria mágica com a resolução do nome do caminho.

Celada
fonte
1
E a magia vive em proc_exe_link()no procsistema de arquivos: lxr.free-electrons.com/source/fs/proc/base.c?v=4.0#L1350
Stephen Kitt
Como você sabe que definitivamente não existe um arquivo com esse nome? Alguém pode ter criado um como um experimento; Eu já fiz isso uma vez antes. Não é muito provável que exista por qualquer outro motivo, mas ainda não é impossível.
precisa saber é o seguinte
4

De acordo com a página de manual do / proc, no Linux 2.2 e posterior, o arquivo é um link simbólico que contém o nome do caminho real do comando executado. Aparentemente, o binário é carregado na memória e /proc/[pid]/exeaponta para o conteúdo do binário na memória .

Por outro lado, no Linux 2.0 e versões anteriores, /proc/[pid]/exeaparentemente é um ponteiro para o arquivo (no sistema de arquivos) que foi executado.

Portanto, se você executasse a mesma lista de comandos no Linux 2.0 ou anterior, provavelmente você receberia um erro "sem esse arquivo ou diretório".

dr01
fonte
Qual página de manual? linux.die.net/man/5/proc e manpages.ubuntu.com/manpages/utopic/en/man5/proc.5.html dizem que "tentar abri-lo abrirá o executável", mas não diz onde vem de.
Muni
1
Tenho certeza de que o kernel fornece o conteúdo dos inodes para o binário, em vez de sua cópia na memória. É improvável que a cópia na memória contenha todas as seções do arquivo. Os inodes, por outro lado, são contados por referência e não serão substituídos enquanto existirem referências. O kernel manterá uma referência à execução de arquivos para que possa carregar seções adicionais, se necessário.
Mark