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 porstracecom a opção-e. Por exemplo, para ver apenas operações de gravação que normalmente são coisas comostdoutde uma execução de script:strace -p 10043 -s99999 -e write - Use o sistema de arquivos
/procpara aprender mais sobre um processo. Por exemplo, para PID10043, você podecd /proc/10043. Ele conterá arquivos interessantes como:-
environfile - 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 comandofdtambé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/255també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/daemonwaitpara 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