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.
dbus
).
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
.