Imprime pids e nomes de processos à medida que são criados

10

Da pergunta aqui , o OP quer pesquisar repetidamente o pid de um processo usando pidof em um script de shell. É claro que isso é ineficiente, pois um novo processo deve ser iniciado para o programa pidof várias vezes por segundo (não sei se essa é a causa dos picos de CPU na pergunta, mas parece provável).

Normalmente, a maneira de contornar esse tipo de coisa em um script de shell é trabalhar com um único programa que produza os dados necessários em stdout e, em seguida, faça algum processamento de texto, se necessário. Embora isso envolva que mais programas sejam executados simultaneamente, é provável que ele seja menos intensivo da CPU, pois novos processos não são criados continuamente para fins de pesquisa.

Portanto, para a pergunta acima, uma solução pode ser ter algum programa que produza os nomes e pids dos processos à medida que são criados. Então você poderia fazer algo como:

pids-names |
  grep some_program |
  cut -f 2 |
  while read pid; do
    process-pid "$pid"
  done

O problema é que isso levanta uma questão mais fundamental: como os nomes de pids e de processos podem ser impressos à medida que são criados?

Eu encontrei um programa chamado ps-watcher , embora o problema com isso seja que é apenas um script perl que executa repetidamente ps para que não resolva realmente o problema. Outra opção é usar auditd , o que provavelmente funcionaria se o log fosse processado diretamente via tail -f . Uma solução ideal seria mais simples e mais portátil do que isso, embora eu aceite uma solução auditd se for a melhor opção.

    
por Graeme 22.10.2014 / 22:38

2 respostas

6

Resposta específica do Linux:

perf-tools contém um execsnoop que faz exatamente isso. Ele usa vários recursos específicos do Linux, como o ftrace. No Debian, está no pacote perf-tools-unstable .

Exemplo de eu executando man cat em outro terminal:

root@Zia:~# execsnoop 
TIME        PID   PPID ARGS
17:24:26  14189  12878 man cat 
17:24:26  14196  14189 tbl 
17:24:26  14195  14189 preconv -e UTF-8 
17:24:26  14199  14189 /bin/sh /usr/bin/nroff -mandoc -Tutf8 
17:24:26  14200  14189 less 
17:24:26  14201  14199 locale charmap 
17:24:26  14202  14199 groff -mtty-char -Tutf8 -mandoc 
17:24:26  14203  14202 troff -mtty-char -mandoc -Tutf8 
17:24:26  14204  14202 grotty 

Eu duvido que exista uma maneira portátil de fazer isso.

    
por 22.10.2014 / 23:26
2

O Right Way TM de fazer isso depende muito de qual sistema e kernel você está realmente rodando. O DTrace deve funcionar no Solaris, Free / NetBSD e Linux.

Para o Linux especificamente, você pode usar o ftrace (que deve estar habilitado em tempo de compilação - geralmente é) ou proc eventos através de netlink - veja o Então responda ao problema para mais detalhes (e lembre-se de votar, a pontuação ~ 30 vs. 0 para resposta aceita parece engraçada). O rastreador de um homem pobre provavelmente poderia ser implementado usando strace -eexec,fork (embora com sobrecarga irracional).

    
por 22.10.2014 / 23:54