Por que o pstree mostra o nome do meu script em vez do nome do shell que está interpretando?

3

Eu escrevi um script de shell simples da seguinte forma:

#!/bin/bash
sleep 90

Depois de executar este shell, executo pstree em um shell separado para ver a estrutura da árvore de processos.

Aqui está o que eu vejo

-gnome-terminal-+-bash---sleepy.sh---sleep

Eu esperava que fosse assim

-gnome-terminal-+-bash---bash---sleep

Por que um script de shell é representado como um processo por pstree? O comando ps mostra corretamente o comando sendo executado como

10150  8771  0 08:13 pts/1    00:00:00 /bin/bash ./sleepy.sh

Aqui o processo é bash e sleepy.sh é seu argumento (isso faz sentido para mim). Na minha opinião, um processo deve ser um formato binário executável (ELF). Bash é um executável ELF, mas um script de shell não é e, portanto, eu acho que pstree não deveria mostrar isso como tal?

    
por sshekhar1980 15.11.2016 / 14:01

1 resposta

5

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).

    
por 15.11.2016 / 17:21

Tags