shell do processo de script

3

Estou fazendo algumas experiências para saber como as variáveis de ambiente são herdadas do processo pai para o processo filho executando scripts de shell em zsh e, em seguida, use pstree <username> para ver a árvore de herança.

Suponho que zsh faça um fork para executar um script. Mas o nome do processo no pstree é o nome do arquivo de script não zsh .

#parent.sh
#! /bin/zsh
export AMA=1
./childEcho.sh #call child
#childEcho.sh
#! /bin/zsh
echo ${AMA}
./subchild.sh #call sub_child
#subchild.sh
#! /bin/zsh
echo ${AMA}
sleep 5d #sleep so that pstree can see the process tree 

Então pstree mostra que

sshd───zsh───parent.sh───childEcho.sh───subchild.sh───sleep

Em seguida, excluo o cabeçalho do hashbang nos scripts, executo novamente e, em seguida, por pstree , recebo

sshd───zsh───sh───sh───sh───sleep

Portanto, o processo agora é sh em vez do nome do arquivo de script.

  1. Por que temos esse comportamento diferente?
  2. Como o pstree determina o nome do processo e desenha a árvore?
  3. Algo mudou o nome do processo em tempo de execução?
por Gab是好人 05.05.2017 / 19:14

1 resposta

4

Um programa pode alterar sua própria linha de comando (como mostrado na coluna CMD de ps , ou pstree ). Isso é o que o zsh está fazendo - está mudando seu nome de comando para o shell script, presumivelmente para tornar mais fácil dizer o que cada zsh está fazendo quando olha para ps .

Por exemplo (embora eu esteja usando bash, não zsh, mas o mesmo funciona em zsh - testei):

$ perl -E '$0 = "I AM PERL"; sleep(60);' &
[1] 504
$ ps 504
  PID TTY      STAT   TIME COMMAND
  504 pts/22   S      0:00 I AM PERL

Você pode obter o executável real por readlink /proc/PID/exe , pelo menos no Linux.

    
por 05.05.2017 / 19:42