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

10

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

Geralmente, a maneira de contornar esse tipo de coisa em um script de shell é trabalhar com um único programa que gera os dados de que você precisa stdoute, em seguida, faz algum processamento de texto, se necessário. Embora isso envolva a execução simultânea de mais programas, é provável que consuma menos CPU, pois novos processos não estão sendo criados continuamente para fins de pesquisa.

Portanto, para a pergunta acima, uma solução pode ser ter algum programa que produza os nomes e os pids dos processos à medida que são criados. Então você pode 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 pids e os nomes de processos podem ser impressos à medida que são criados?

Eu encontrei um programa chamado ps-watcher, embora o problema disso seja que ele é apenas um perlscript que é executado repetidamente pspara que realmente não resolva o problema. Outra opção é usar o auditdque 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 auditdsolução se for a melhor opção.

Graeme
fonte
1
Uma observação interessante é que o pid é criado primeiro como uma cópia do processo de criação ( forkou variante) e, em seguida, o novo programa é iniciado usando um membro da execfamília. Então você provavelmente deseja registrar o exec*, não o fork.
Derobert 22/10
2
A única maneira eficiente e portátil de que conheço é usar a contabilidade de processos Unix comum, que gravará um registro após a saída do processo. Se você deseja capturar processos à medida que são criados ou executados, provavelmente precisará de itens específicos do sistema, como Linux auditd, systemtap ou dtrace.
Mark Plotnick
Portanto, para a pergunta acima, uma solução pode ser ter algum programa que produza os nomes e os pids dos processos à medida que são criados. - Como eles são criados? Parece que você está pensando em um observador (é assim que eles os chamam no mundo dos navegadores). Gostaria de saber se Python seria adequado para atuar como um "guarda da porta"? Os fatos são que o Python pode se aprofundar profundamente no funcionamento interno do sistema (por exemplo dbus).
Syntaxerror 22/10
1
@syntaxerror O DBus está longe do trabalho interno do sistema neste caso - na verdade, é cerca de dois níveis acima do que está sendo discutido aqui.
Peterph
OK, na linguagem OSI, o nível discutido aqui pode ser ainda menor do que o do dbus. Admito que não tinha pensado em profundidade se os dois estão na mesma categoria ou não.
Syntaxerror 23/10

Respostas:

6

Resposta específica do Linux:

O 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-instable .

Exemplo de mim rodando man catem 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 

Duvido que exista uma maneira portátil de fazer isso.

derobert
fonte
2

maneira direita TM de fazer isso depende fortemente o sistema e kernel que você está realmente sendo executado. O DTrace deve funcionar no Solaris, Free / NetBSD e Linux.

Para o Linux especificamente, você pode usar o ftrace (que deve ser ativado no momento da compilação - geralmente é) ou proc proc via netlink - veja a resposta SO para o problema para obter mais detalhes (e lembre-se de votar, a pontuação ~ 30 vs. 0 para resposta aceita parece engraçado). O rastreador do pobre homem provavelmente poderia ser implementado usando strace -eexec,fork(embora com sobrecarga irracional).

peterph
fonte