Como obter o nome completo do executável de um processo em execução no Linux

5

Estou escrevendo um script que usará o nome do arquivo dos processos em execução. No entanto, não consigo determinar o nome do executável completo de alguns processos.

Inicialmente, decidi consultar a entrada Name em /proc/PID/status (ou o segundo campo em /proc/PID/stat ). No entanto, de acordo com a página de manual , esse campo é sempre truncado para 15 caracteres, mas eu precisa do nome completo para evitar conflito / confusão.

Uma resposta de essa questão sugere usar /proc/PID/cmdline , mas também há problemas. Alguns programas (por exemplo, chromium, electron) fazem coisas estúpidas / inteligentes com o valor em /proc/PID/cmdline , então não posso simplesmente dividir os dados por NULL e obter diretamente o nome do programa como sugerido na manpage - eles preenchem um muitas coisas para o campo argv [0] original e separá-las pelo espaço, e eu não acho que meramente a divisão por espaço seja uma boa escolha, porque o caminho / nome do arquivo pode conter espaços.

Isso é ainda mais complicado quando descubro que alguns scripts (por exemplo, scripts python) estão no formato /usr/bin/python /path/to/script , enquanto alguns estão no formato /path/to/script . Embora isso seja muito mais fácil de lidar, contanto que eu tenha esse campo (sem atolamentos como acima) e verifique e divida manualmente.

Alguma idéia de como obter o nome completo do programa / nome do arquivo? Não importa se o nome contém o caminho completo ou não, porque isso pode ser facilmente resolvido (até onde eu posso ver agora).

    
por renyuneyun 27.05.2017 / 15:52

2 respostas

5

/proc/$PID/exe parece ser o que você está procurando: ( proc(5)

/proc/[pid]/exe
Under Linux 2.2 and later, this file is a symbolic link containing the actual pathname of the executed command. This symbolic link can be dereferenced normally; attempting to open it will open the executable.

Então, simplesmente:

$ /bin/cat & readlink /proc/$!/exe
/bin/cat

Na verdade, segue as renomeações no arquivo executável:

/tmp$ cp /bin/cat . ; ./cat & mv cat dog ; readlink /proc/$!/exe
/tmp/dog
    
por 27.05.2017 / 17:15
-2

Em uma plataforma com um suporte padrão procfs com procfs-2, você obtém o resultado via:

ls -l /proc/<pid>/path/a.out

O arquivo a.out é um symlink para o caminho absoluto do binário.

Observe que a pergunta não mencionou o Linux e, por esse motivo, faz sentido fornecer informações sobre como esse recurso funciona na implementação procfs original do inventor do Procfs, Roger Faulkner.

    
por 12.06.2018 / 14:44