Como obter os comandos precisos que um processo bash está acionando?

0

Se um script bash em execução, ele aparecerá na minha ps output como

# ps -e 
[...]
10043 pts/1    00:00:00 bash
[...]

Como faço para conhecer os comandos precisos que estão sendo executados?

Obrigado,

    
por user624894 30.11.2016 / 00:53

2 respostas

3

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 por strace com a opção -e . Por exemplo, para ver apenas operações de gravação que normalmente são coisas como stdout 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 PID 10043 , você pode cd /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 'ps(1)' ' ' < /proc/19774/cmdline | sed 's/ $/\n/' file - mostrará exatamente os argumentos da linha de comando do processo em execução. Você pode ver esses argumentos como: ps -up 19774 . O comando fd também exibe esse tipo de informação como ls -l ./fd/ .
    • lsof(8) folder - contém identificadores de arquivos abertos do processo em execução. Para visualizar arquivos abertos pelo processo, você pode 255 . O comando /proc/19774/fd/255 também exibe esse tipo de informação. Para scripts bash, o descritor de arquivo pstree(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
    
por Sam Gleske 30.11.2016 / 01:19
3

Opção 1: inicie seu script com bash -x /path/to/your/script.sh . O Bash irá imprimir cada linha que estiver executando, prefixada com um +.

Opção 2: use strace : strace -p 10043 (substituindo 10043 pelo ID do processo real do script). Ele dirá o que um script em execução está fazendo, provavelmente com muito mais detalhes do que você precisa.

    
por sмurf 30.11.2016 / 01:18

Tags