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.
dbus).
forkou variante) e, em seguida, o novo programa é iniciado usando um membro daexecfamília. Então você provavelmente deseja registrar oexec*, não ofork.