A partir da pergunta aqui , o OP deseja 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 pidof
programa 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 stdout
e, 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 perl
script que é executado repetidamente ps
para que realmente não resolva o problema. Outra opção é usar o auditd
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 auditd
solução se for a melhor opção.
fonte
fork
ou variante) e, em seguida, o novo programa é iniciado usando um membro daexec
família. Então você provavelmente deseja registrar oexec*
, não ofork
.dbus
).Respostas:
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 cat
em outro terminal:Duvido que exista uma maneira portátil de fazer isso.
fonte
Há 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).fonte