Não há realmente uma boa maneira de ver os comandos precisos sendo executados dentro do intérprete bash do ponto de vista de um estranho para o meu conhecimento. No entanto, há algumas coisas que você pode fazer para saber mais sobre o processo de execução.
- Use
strace(1)
como o usuário root para se conectar à ID do processo e imprimir chamadas do sistema em que o processo está sendo feito. Você pode limitar o escopo do que é gerado porstrace
com a opção-e
. Por exemplo, para ver apenas operações de gravação que normalmente são coisas comostdout
de uma execução de script:strace -p 10043 -s99999 -e write
- Use o sistema de arquivos
/proc
para aprender mais sobre um processo. Por exemplo, para PID10043
, você podecd /proc/10043
. Ele conterá arquivos interessantes como:-
environ
file - Contém o ambiente do processo em execução. Para ver as variáveis definidas, você pode executar:tr '
cmdline
' '\n' < ./environ -
tr '
file - mostrará exatamente os argumentos da linha de comando do processo em execução. Você pode ver esses argumentos como:ps(1)
' ' ' < /proc/19774/cmdline | sed 's/ $/\n/'ps -up 19774
. O comandofd
também exibe esse tipo de informação comols -l ./fd/
. -
lsof(8)
folder - contém identificadores de arquivos abertos do processo em execução. Para visualizar arquivos abertos pelo processo, você pode255
. O comando/proc/19774/fd/255
também exibe esse tipo de informação. Para scripts bash, o descritor de arquivopstree(1)
geralmente contém o script em execução (por exemplo,pstree -ap 10043
). Isso nem sempre é o caso.
-
- Use
/tmp/daemonwait
para visualizar um processo e seus processos filhos para Tenha uma ideia da localização que está sendo executada no script. por exemplo. %código%
Experimente
Crie um /proc
com o conteúdo:
cat > /tmp/daemonwait <<'EOF'
while sleep 1;do echo hello;done
EOF
Como usuário normal, execute o script.
bash /tmp/daemonwait > /dev/null &
#save the PID for later use
pid=$!
Como você iniciou o processo como usuário, é possível ler o sistema de arquivos 255
desse processo.
Veja alguns exemplos da descrição acima para tentar.
#view the running bash script; press q for quit
less /proc/$pid/fd/255
#view the environment of the running bash script
tr '#view all open files of the process
ls -l /proc/$pid/fd/
#notice the daemonwait script is file descriptor 255
' '\n' < /proc/$pid/environ | less
#watch the process write to stdout or stderr; requires root
sudo strace -p $pid -s99999 -e write
#list the process, child processes, and their args
pstree -ap $pid
Quando o script não é um descritor de arquivo 255
Explorando quando o descritor de arquivo daemonwait
não é o script sendo executado.
kill $pid
chmod 755 /tmp/daemonwait
/tmp/daemonwait > /dev/null &
pid=$!
Vamos agora tratar o #!/bin/bash
como um script executável. Observação: se você não estiver usando o bash como seu shell padrão, será necessário adicionar /tmp/daemonwait
ao início do script %code% .
ls -l /proc/$pid/fd/
#notice the daemonwait script is now file descriptor 254
Vamos analisar novamente os descritores de arquivo para o processo em execução.
kill $pid
rm /tmp/daemonwait
Limpar
Limpe quando terminar de brincar.
cat > /tmp/daemonwait <<'EOF'
while sleep 1;do echo hello;done
EOF