De la question ici , l'OP veut interroger à plusieurs reprises le pid d'un processus utilisant pidof
dans un script shell. Bien sûr, cela est inefficace car un nouveau processus doit être démarré pidof
plusieurs fois par seconde pour le programme (je ne sais pas si c'est la cause des pics de CPU dans la question, mais cela semble probable).
Habituellement, le moyen de contourner ce genre de chose dans un script shell est de travailler avec un seul programme qui génère les données dont vous avez besoin stdout
, puis de faire du traitement de texte si nécessaire. Bien que cela implique davantage de programmes à exécuter simultanément, il est probable que le processeur soit moins gourmand car de nouveaux processus ne sont pas continuellement créés à des fins d'interrogation.
Donc, pour la question ci-dessus, une solution pourrait être d'avoir un programme qui génère les noms et les pids des processus lors de leur création. Ensuite, vous pourriez faire quelque chose comme:
pids-names |
grep some_program |
cut -f 2 |
while read pid; do
process-pid "$pid"
done
Le problème avec cela est qu'il soulève une question plus fondamentale, comment les pids et les noms de processus peuvent-ils être imprimés lors de leur création?
J'ai trouvé un programme appelé ps-watcher
, bien que le problème avec ceci soit que ce soit juste un perl
script qui s'exécute à plusieurs reprises, ps
donc il ne résout pas vraiment le problème. Une autre option consiste à utiliser auditd
ce qui pourrait probablement fonctionner si le journal a été traité directement via tail -f
. Une solution idéale serait plus simple et plus portable que cela, bien que j'accepte une auditd
solution si c'est la meilleure option.
dbus
).
fork
ou variante), puis le nouveau programme est démarré en utilisant un membre de laexec
famille. Donc, vous voulez probablement enregistrer leexec*
, pas lefork
.