Como obter o caminho de um arquivo de script atual em execução?

0

Sabendo que o PID do programa, eu quero listar o arquivo executável de um programa em execução.

Para programas binários, posso ler /proc/$pid/exe , que é um link simbólico para o executável.

No entanto, para programas de script, por exemplo, um programa em Python, /proc/$pid/exe aponta para /usr/bin/python , não o próprio programa. Isso acontece, não importa se eu iniciei o programa com ./program.py ou com python program.py .

Eu tentei várias maneiras de resolvê-lo:

/proc/$pid/cmdline contém o nome do arquivo do script, mas está no caminho relativo e o diretório de trabalho já pode ter sido alterado.

Eu também tentei /proc/$pid/comm , mas pode ser facilmente alterado pelo programa.

Então, como saber o arquivo de script original de um programa em execução?

    
por Star Brilliant 06.04.2016 / 20:18

1 resposta

0

Podemos presumir que os arquivos não foram alterados no disco (pelo menos, nenhum arquivo com o mesmo nome foi adicionado ou excluído) e /proc/[pid]/cmdline é confiável (veja a nota abaixo)?

De acordo com proc (5) : /proc/[pid]/environ contém as variáveis de ambiente iniciais (que não será alterado mesmo que o próprio programa altere as variáveis de enventimento dentro), incluindo PWD e PATH .

Portanto:
se o caminho em cmdline começar com o (s) nome (s) dir. relativo (s), você poderá usar PWD (em /proc/[pid]/environ ) como o caminho base e resolver o caminho relativo; Se o caminho em cmdline for o nome do próprio programa, você poderá percorrer cada diretório em PATH (em /proc/[pid]/environ ) e o destino será o arquivo primeiro com o mesmo nome.

Notas laterais:

/proc/[pid]/exe parece ser o arquivo não referenciado (por exemplo, /usr/bin/python3.6 em vez de /usr/bin/python3 ou /usr/bin/python se forem links simbólicos);

/proc/[pid]/cmdline também pode conter informações estranhas para alguns programas, portanto pode não ser confiável. Isso parece estar relacionado ao programa, mas não ao kernel, e eu não observei nenhum script python se comportando desta maneira (e editar sys.argv em python parece não afetar /proc/[pid]/cmdline ). Minha pergunta também falou um pouco sobre isso.

    
por 28.05.2017 / 19:29