Todos os utilitários obtêm suas informações de /proc/$PID
de qualquer maneira, mas há (pelo menos) três lugares em /proc/$PID
que contêm o nome do executável de alguma forma, e eles relatam informações diferentes.
- O campo
Name
em/proc/$PID/status
(também disponível em um formato mais difícil de analisar em/proc/$PID/stat
). Este é o nome do executável, mas truncado para 15 caracteres. Como o kernel executa o truncamento, nenhuma opção paraps
pode ajudar. Isso é o que mostraps -o comm
(ou seu sinônimops -o ucmd
). - O link simbólico
/proc/$PID/exename
aponta para o arquivo executável. Você pode obter seu conteúdo comreadlink /proc/$PID/exename
. Ao contrário das informações relatadas porps
, apenas o usuário que está executando o processo tem permissão para ler o destino do link. - O argumento zeroth para o processo, conforme escolhido pelo shell ou outro programa que o invocou. Por convenção, os shells escolhem o nome do executável conforme você o digitou (com ou sem um caminho completo). Você pode obter todos os argumentos de
ps
comps -o cmd
(ou seu sinônimops -o command
), mas os argumentos são separados por espaços para que você não possa dizer com segurança onde o argumento zeroth para. Você pode ler os argumentos de/proc/cmdline
, onde eles são separados por caractere nulo:</proc/$PID/cmdline awk -vRS='
extrai o argumento zeroth.Name
' '{print; exit;}'
Para completar, deixe-me mencionar que esses nomes podem mudar durante a vida útil do processo, embora a maioria dos programas não o faça:
- O processo pode alterar o campo
/proc/$PID/status
deprctl
chamandoPR_SET_NAME
com o argumento(deleted)
. - O arquivo executável pode ser renomeado ou excluído. Em casos simples, o Linux controla o novo nome (mas os casos de borda podem não funcionar, por exemplo, se você criar um link físico para o executável). Se o arquivo for excluído, o kernel adicionará
argv[0]
ao destino do link. - O argumento zeroth para o processo é lido na memória do processo (é %code% em C). O processo pode modificá-lo livremente.