Tente isso com um <pid>
válido,
/bin/cat /proc/<pid>/comm
Isso daria o nome do executável.
/bin/ls -lt /proc/<pid>/exe
O texto acima indicará o caminho do executável.
Estou trabalhando no linux.
Existe alguma maneira de obter o nome do programa definido pelo usuário, dado o PID desse programa em execução?
Eu quero mostrar o nome do programa, não o nome do processo.
Por exemplo: Eu tenho um aplicativo java
, chamado
Existem alguns comandos que satisfazem necessidades parciais como:
cat /proc/"PID"/cmdline
- >
Isso fornecerá os argumentos de linha de comando que criam esse processo com o "PID" fornecido. Mas se tivermos vários programas em diferentes linguagens de programação, o formato do comando que executa esse programa não será o mesmo. Então, nesse caso, como extrair o nome exato do programa deste comando?
readlink -f /proc/"PID"/exe
- > Isso fornecerá o nome do arquivo executável relacionado ao processo com o "PID" fornecido. Mas alguns processos não possuem arquivos executáveis. Nesse caso, não retornará nada.
Na verdade, estou trabalhando em grande escala. Desejo localizar o nome do aplicativo (ou nome do arquivo de origem ou nome do programa) para todos os processos em execução no servidor. Então eu não quero codificar nada especificamente para qualquer linguagem de programação como java, cpp, python, etc. Por favor me sugira algo genérico a esse respeito.
Tente isso com um <pid>
válido,
/bin/cat /proc/<pid>/comm
Isso daria o nome do executável.
/bin/ls -lt /proc/<pid>/exe
O texto acima indicará o caminho do executável.
Você está tentando definir um conceito que simplesmente não existe. Você não encontrará um conceito geral de “nome do programa” ou “nome do aplicativo” que vá além do que você pode encontrar como o nome do executável.
O nome do arquivo de origem s não é, em geral, armazenado no executável. Para um script, o nome do arquivo de origem “principal” é o executável, mas um script também usa código de muitos outros locais (o interpretador, pelo menos). Para um programa compilado, as informações não estão disponíveis em tempo de execução, a menos que algo específico para o compilador ou cadeia de compilação o coloque lá, e a maioria não o faz.
Observar /proc/$pid/exe
fornece o caminho para o executável. Todos os processos possuem um executável¹. O executável pode ter sido renomeado ou excluído desde que o processo foi iniciado. Esse é o único conceito universal de "nome do programa".
O primeiro elemento de /proc/$pid/cmdline
é o argumento 0 passado ao invocar o processo. Esse nome é escolhido pelo chamador do processo. A menos que o chamador tenha saído do caminho, normalmente é o nome base do executável, com ou sem uma parte do diretório, dependendo se o programa foi chamado por meio de uma pesquisa PATH. Um processo pode sobrescrever esta parte, mas poucos programas fazem (na maioria, alguns daemons fazem isso para refletir seu status de uma maneira que pode ser facilmente vista com ps
).
O Linux também armazena um nome de processo que é reportado por ps -o comm
. Está acessível através de /proc/$pid/status
. Esse é o nome base inicial do executável, truncado para 16 bytes.
¹ Existem entradas em /proc
cujo link exe
não é legível. Esses são threads ou zumbis do kernel, não processos. Para todos os processos, o link é legível (com a devida permissão), embora possa não apontar para um arquivo existente se o executável tiver sido excluído.
Não haverá solução geral para isso,
porque nem sempre é possível.
Se eu tiver um programa em C, blue.c
e eu compilar com
cc blue.c -o green
e, em seguida, execute o executável green
,
não haverá maneira de determinar se o nome da fonte era blue.c
,
falta de medidas forenses como procurar meu diretório.
(Esta afirmação é verdadeira para pelo menos alguns compiladores C.)
Tags linux linux-kernel