Je suis en train d'écrire une application wrapper dans des scripts bash et je veux que l'application garde une trace des outils / processus qui ont été lancés à partir de scripts utilisateur. J'aimerais savoir quel est le meilleur moyen de déterminer la liste des processus enfants générés par ce processus parent.
j'ai essayé
- Invoquez périodiquement la commande ps et construisez un arbre de processus (comme ps -ejH), mais cela omet les processus qui se terminent très rapidement.
- Utiliser un outil tel que forkstat qui utilise l'interface du connecteur proc, mais qui ne peut s'exécuter qu'avec des privilèges élevés. Bien que cela donne les données correctes, une exécution en tant que sudo ne fonctionnerait pas dans mon cas?
Des suggestions sur la façon dont cela peut être réalisé?
process
ps
process-management
divyanshm
la source
la source
gdb -p PID -batch -ex 'p system("command")'
.Réponses:
Si vous utilisez Linux, vous pouvez utiliser
strace
pour tracer les appels système utilisés par un processus. Par exemple:Vous pouvez voir que le script a déclenché trois processus (PID 4818, 4819, 4820) à l'aide de l'
clone(2)
appel système et que lesexecve(2)
appels système de ces processus ont montré les commandes exécutées.-e fork,vfork,clone,execve
limite la sortie strace à ces appels système-f
suit les processus enfants-b execve
se détache d'un processus lorsqueexecve
est atteint, nous ne voyons donc pas de traçage supplémentaire des processus enfants.la source
-e
une poignée d'appels système, cela ne fait que ralentir les choses pour les processus qui utilisent ces appels très fortement.strace -qfe trace=execve -o /dev/null -p PID
sur un shell exécuté/.configure && make
dans le répertoire source bash. Ensuite, il y a toujours le problème de l'analyse de la sortie de strace dans un arbre - cela ne sonne pas comme un morceau de gâteau ;-)Je pense que c'est ce que vous cherchiez.
utilisez direct pid ou pgrep avec le nom du processus.
-p utilisé pour imprimer des pids d'enfants.
la source
La commande pgrep sera utile. Utilisez ces commandes:
Imprimer les PID de chaque processus créé à partir de process (
$pid
):Pour des informations plus détaillées sur chaque processus forké, utilisez cette commande:
où
$pid
est votre identifiant de processus.la source
En supposant que vous écrivez en bash (vous ne dites pas). Ensuite, vous pouvez utiliser le contrôle des travaux. Ceci est désactivé par défaut, lors de l'exécution de scripts.
Le manuel de bash dit:
Donc, ajoutez à votre script
set -m
, les commandes que vous pouvez démarrer, aveccommand &
, puis faites-lejobs
pour lister les tâches.la source