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.
la source
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
.dbus
).Réponses:
Réponse spécifique à Linux:
perf-tools contient un execsnoop qui fait exactement cela. Il utilise diverses fonctionnalités spécifiques à Linux telles que ftrace. Sur Debian, son dans le paquet perf-tools-unstable .
Exemple de moi fonctionnant
man cat
dans un autre terminal:Je doute qu'il existe un moyen portable de le faire.
la source
Il Right Way TM de faire cela dépend en grande partie sur ce système et noyau que vous êtes réellement en cours d' exécution sur. DTrace devrait fonctionner sur Solaris, Free / NetBSD et Linux.
Pour Linux en particulier, vous pouvez utiliser soit ftrace (qui doit être activé au moment de la compilation - c'est généralement le cas) soit des événements proc sur netlink - voir la réponse SO au problème pour plus de détails (et n'oubliez pas de voter, le score ~ 30 contre 0 pour la réponse acceptée semble drôle). Le traceur du pauvre pourrait probablement être mis en œuvre en utilisant
strace -eexec,fork
(bien qu'avec des frais généraux déraisonnables).la source