Supposons que j'ai un exécutable appelé 'exe' qui engendre un processus fils. Ce processus enfant doit devenir un démon et nous devons changer son nom. Ensuite, je veux utiliser killall pour envoyer un signal à ce processus en utilisant le nouveau nom, mais je dois utiliser l'ancien nom.Pourquoi ne puis-je pas utiliser killall avec le nouveau nom donné à un processus fils avec execvp() sous Linux?
L'ordre des événements est la suivante:
- start 'exec'
- fourche -> sortie si le parent
- détachement (chdir, setsid, umask)
- execvp ('exec' , 'daemon', ...)
Sur 4, argv [0] est défini sur 'daemon'. Après cela, je peux faire un 'ps' et un 'top' et je vois clairement le nom 'daemon' apparaissant dans la sortie de ces commandes. Cependant, quand j'essaye de tuer le processus (envoyer un signal) en utilisant killall, je dois fournir le nom 'exec' et non 'daemon'.
Il semble que le noyau ne soit pas entièrement conscient du nouveau nom.
La raison pour laquelle j'ai besoin de cette fonctionnalité est que je veux générer quelques processus enfants avec des responsabilités différentes en utilisant le même exécutable. Je veux aussi pouvoir les arrêter et les démarrer individuellement en me référant à eux par leur nom. Et je ne veux pas créer un lien symbolique entre les nouveaux noms et l'exec executable commun (comme le fait busybox).
Y a-t-il un moyen de contourner cela? Je utilise Linux Ubuntu 9.10.
Cheers, Johan
Pourquoi ne pas retenir que tous votre enfant de pid et les utiliser pour interagir avec eux? – Ramon
On dirait que se souvenir du pid va être beaucoup plus sûr que de faire "killall" et potentiellement cibler d'autres processus (non-enfant) avec le même nom. –
L'idée est de pouvoir avoir une interaction sur le shell avec les processus en cours. utiliser 'killall' semblait le plus évident sans avoir recours aux outils de bricolage qui ont besoin d'obtenir le pid de quelque part ... – Johan