A opção -f
não exibe o caminho completo para o executável, ele exibe a linha de comando usada para chamar o executável. Esta informação é legível por todo o mundo, de /proc/PID/cmdline
, ao contrário do caminho para o executável de /proc/PID/exe
, que só pode ser lido pelo usuário que executou o processo.
Você pode verificar quais dados ps
está lendo, observando suas chamadas de sistema - executar strace ps -ef -p 1 | less
:
…
stat("/proc/1", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
open("/proc/1/stat", O_RDONLY) = 6
read(6, "1 (init) S 0 1 1 0 -1 4202752 78"..., 1024) = 191
read(6, "", 833) = 0
close(6) = 0
open("/proc/1/status", O_RDONLY) = 6
read(6, "Name:\tinit\nState:\tS (sleeping)\nT"..., 1024) = 752
read(6, "", 272) = 0
close(6) = 0
…
open("/proc/1/cmdline", O_RDONLY) = 6
read(6, "/sbin/init", 2047) = 10
close(6) = 0
…
Se você passar a opção c
, ps
informará o nome do comando de /proc/PID/stat
, que também é legível por todos. Este é o nome de base do executável (sem informações de caminho) truncado para 16 caracteres.
Eu não acho que ps
tenha uma opção para relatar o caminho para o executável encontrado em /proc/PID/exe
. Você pode listá-lo com lsof
(o txt
descritor de arquivo) - e, como era de se esperar, reclama /proc/1/exe (readlink: Permission denied)
quando solicitado a imprimir as informações sobre o processo de outro usuário.
N.B. Minha resposta é sobre o Linux. Os detalhes de quais informações podem ser relatadas sobre os processos de outros usuários e como elas funcionam são muito diferentes nas variantes do Unix.