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

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

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

Inicialmente, decidi consultar a Nameentrada /proc/PID/status(ou o segundo campo em /proc/PID/stat). Contudo, de acordo com opágina de manual, esse campo é sempre truncado para 15 caracteres, mas preciso do nome completo para evitar conflito/confusão.

Uma resposta deessa questãosugere usar /proc/PID/cmdline, mas também há problemas. Alguns programas (por exemplo, cromo, elétron) fazem coisas estúpidas/inteligentes com o valor, /proc/PID/cmdlineentão não posso simplesmente dividir os dados NULLe obter diretamente o nome do programa, conforme sugerido na página de manual - eles preenchem muitas coisas no original argv[0] e separe-os por espaço, e não acho que apenas dividir por espaço seja uma boa escolha porque o caminho/nome do arquivo pode conter espaços.

Isso fica ainda mais complicado quando descubro que alguns scripts (por exemplo, scripts python) estão no formato /usr/bin/python /path/to/scriptenquanto outros estão no formato /path/to/script. Embora isso seja muito mais fácil de lidar, desde que eu tenha esse campo (sem congestionamentos 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 posso ver agora).

Responder1

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

/proc/[pid]/exe
No Linux 2.2 e posterior, este arquivo é um link simbólico que contém o nome do caminho real do comando executado. Este link simbólico pode ser desreferenciado normalmente; tentar abri-lo abrirá o executável.

Então, simplesmente:

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

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

/tmp$ cp /bin/cat . ; ./cat & mv cat dog ; readlink /proc/$!/exe
/tmp/dog

Responder2

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

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

O arquivo a.out é um link simbólico 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 procfsimplementação original do inventor do procfs, Roger Faulkner.

informação relacionada