strace um processo de curta duração

0

Estou tentando aprender sobre o comportamento de um processo de curta duração criado por um dos meus aplicativos. Eu sei essas coisas sobre esse processo:

  1. Parte do nome do processo.
  2. O nome e o PID do aplicativo que criará este processo.
  3. Aproximadamente quando o processo iniciar (dentro de 5 a 10 minutos).
  4. Após o processo ter saído, o PID do processo.

Idealmente, gostaria de:

  1. Solicite ao kernel (ou algo assim) que notifique meu script de que esse processo foi iniciado.
  2. Executa um monte de ferramentas contra o processo (iostat, strace, etc).

Existe uma maneira de o kernel me avisar que um certo processo foi iniciado, para que eu possa tomar alguma providência?

Executar algo como while true; do ps -ef | grep ${MY_PROCESS_NAME}; done parece volumoso e ruim. Eu gostaria de poder ser notificado quando isso acontecer, em vez de procurar por força bruta.

Ou, terei que executar as ferramentas apenas no processo pai e em todos os processos filhos e filtrar a saída posteriormente? Por exemplo, strace -ff -o ./some.trace -p ${PARENT_PID} .

    
por Grant Gordon 27.04.2018 / 16:48

1 resposta

1

Você pode querer olhar execsnoop (assumindo que seu kernel foi configurado com CONFIG_FTRACE, que geralmente é o caso). Este é um dos muitos scripts da coleção de rastreamento e desempenho Brendan Gregg. Sem args, mostra todos os comandos quando eles iniciam no sistema, ou você pode dar um regexp para assistir.

Por exemplo, para procurar comandos que qualquer zsh existente ou novo possa estar iniciando, faça:

sudo /opt/perf-tools-master/bin/execsnoop zsh

Mostra-me esta saída quando inicio um novo zsh:

Tracing exec()s issued by process name "zsh". Ctrl-C to end.
Instrumenting sys_execve
   PID   PPID ARGS
 21920  21919 /usr/libexec/grepconf.sh -c
 21923  21922 /usr/bin/tty -s
 21922  21919 /usr/bin/tput colors
 21924  21919 /usr/bin/dircolors --sh /etc/DIR_COLORS.256color
 21925  21919 /usr/bin/grep -qi ^COLOR.*none /etc/DIR_COLORS.256color
 21926  21919 /usr/libexec/grepconf.sh -c
 21928  21919 /usr/libexec/grepconf.sh -c
 21930  21919 uname -m
 21932  21919 /bin/grep -q /usr/lib64/qt-3.3/bin
 21934  21933 /usr/bin/id -u

Depois que você souber o nome completo do programa que está sendo executado, normalmente você deve substituir esse arquivo por um script que execute o programa original depois de adicionar seus ganchos. Se você não puder fazer isso, poderá usar algo como fanotify(7) para que seu programa de rastreamento interfira antes que todos os arquivos abertos tenham permissão para serem concluídos. Ou talvez inotifywatch seja rápido o suficiente para você anexar um strace ao processo.

    
por 27.04.2018 / 17:50