pstree
recupera o nome do processo de /proc/<pid>/stat
. Isso é o que foi dado ao kernel via execve(2)
primeiro parâmetro; veja proc(5)
e O que exatamente acontece quando eu executo um arquivo no meu shell? para detalhes. Você verá a partir do último que o kernel pode executar scripts shell diretamente (e muitos outros "binários" - veja Como o Mono é mágico? ), mas o shell também intervém em alguns casos.
Assim, se você executar
./sleepy.sh
com uma linha shebang no início do script, você verá a saída sleepy.sh
in pstree
porque é isso que o shell pede que o kernel execute. Se ao invés disso você executar
sh ./sleepy.sh
você verá a saída sh
in pstree
.
ps -f
ou ps u
(e pstree -a
) leem /proc/<pid>/cmdline
para recuperar a linha de comando , que é diferente - é o parâmetro argv
dado à execve
chamada do sistema. Ao executar um script de shell com um shebang, isso é alterado para incluir o shebang, que é, sem dúvida, porque no seu caso ps
mostra
/bin/bash ./sleepy.sh
(veja Como os programas são executados para muito mais sobre isso).