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 Name
entrada /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/cmdline
então não posso simplesmente dividir os dados NULL
e 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/script
enquanto 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/exe
parece 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 procfs
com 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 procfs
implementação original do inventor do procfs, Roger Faulkner.