Como rastrear chamadas do sistema sendo chamadas após digitar o comando?

5

Esta questão é relevante para a questão de "o que acontece quando digitamos um comando simples no shell?" eu postei anteriormente. (Eu pensei que seria melhor postar separadamente. Mas se não, por favor me avise.)

Eu aprendi com a pergunta anterior que os comandos internos do shell são tratados especialmente e os comandos externos normais são executados no processo filho.

Desta vez, gostaria de rastrear chamadas do sistema como fork, clone ou execve para monitorar o que realmente aconteceu depois de digitar o comando. Mas só posso rastrear uma chamada execve execve("bin/ls",,,) = 0 quando executo strace dessa maneira.

strace -etrace=execve,clone ls

Isso significa que, como eu acho, só posso monitorar as chamadas do sistema que são chamadas depois que um processo filho é criado.

Para monitorar todas as chamadas do sistema relacionadas à criação de novo processo, O que devo fazer? Invocar o comando com bash -c like strace -etrace=execve,clone bash -c '{ ls; }' seria útil nesse caso?

    
por MS.Kim 07.04.2014 / 07:10

1 resposta

4

Como mencionado em uma das respostas à sua pergunta anterior, a chamada de família exec acontece após a O processo filho é criado, portanto, se você quiser que ele apareça na saída strace , você deverá fazê-lo também seguir os filhos do processo de shell que está rastreando.

Você pode fazer isso adicionando as opções -f ou -ff , aqui estão os snippets da página do manual relevantes:

 -f  Trace child processes as they are created by currently traced processes as a
     result of the fork(2) system call.
-ff  If the -o filename option is in effect, each processes trace is written to
     filename.pid where pid is the numeric process id of each process.  This is
     incompatible with -c, since no per-process counts are kept.

Para rastrear as chamadas relevantes envolvidas na execução de um comando em bash , você pode fazer:

strace -f -e trace=process bash -c 'ls; :'

O -e trace=process rastreia especificamente todas as chamadas envolvidas no gerenciamento de processos. Também o segundo comando no-op ( : ) é necessário como se você executasse o bash com apenas um único comando, é inteligente o suficiente apenas fazer um execve sem bifurcar já que ele sabe que não precisa fazer mais nada .

    
por 07.04.2014 / 13:55