Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1417 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [RESOLU][linux] récupérer les fils de fils

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU][linux] récupérer les fils de fils

n°1064748
IrmatDen
Posté le 28-04-2005 à 19:34:11  profilanswer
 

Salut,
Je bosse sur une interface pour un script. J'aimerais savoir s'il y a un moyen de récupérer la liste des processus lancé par les processus fils de mon interface. Sachant qu'un shéma est plus parlant, le voilou :

dvddumpui
|_ dvddump
   |_ dvdauthor
      |_ streamdvd


Donc, actuellement si je quitte l'interface (dvddumpui), le script (dvddump) quitte normalement. MAIS dvdauthor et streamdvd sont adoptés par init et continue leur boulot. Ce sont donc ces 2 processus que j'aimerais quitter pour bien nettoyer le système...
 
La seule solution que je vois est d'exécuter "ps" et de tout traiter à la main... Existe-t-il une solution plus facile à mettre en oeuvre ?


Message édité par IrmatDen le 29-04-2005 à 00:47:35
mood
Publicité
Posté le 28-04-2005 à 19:34:11  profilanswer
 

n°1064796
Elmoricq
Modérateur
Posté le 28-04-2005 à 20:16:04  profilanswer
 

Ces bonnes vieilles commandes que sont ps, grep et cut vont surement t'être utiles.
 
Fais des man sur ps et cut pour avoir les options qui vont bien.
Couple ça avec un for (pour ksh, foreach pour csh) et tu auras tout ce dont tu as besoin en 5 lignes de code. :)
 
Note qu'il y a un truc qui va pas si les fils ne se tuent pas à la mort du père. Ils sont lancés par des nohup ?


Message édité par Elmoricq le 28-04-2005 à 20:17:05
n°1064811
Sve@r
Posté le 28-04-2005 à 20:28:09  profilanswer
 

IrmatDen a écrit :

Salut,
Je bosse sur une interface pour un script. J'aimerais savoir s'il y a un moyen de récupérer la liste des processus lancé par les processus fils de mon interface. Sachant qu'un shéma est plus parlant, le voilou :

dvddumpui
|_ dvddump
   |_ dvdauthor
      |_ streamdvd


Donc, actuellement si je quitte l'interface (dvddumpui), le script (dvddump) quitte normalement. MAIS dvdauthor et streamdvd sont adoptés par init et continue leur boulot. Ce sont donc ces 2 processus que j'aimerais quitter pour bien nettoyer le système...
 
La seule solution que je vois est d'exécuter "ps" et de tout traiter à la main... Existe-t-il une solution plus facile à mettre en oeuvre ?


 
La notion de "petit-fils" n'existe pas sous Unix (et apparentés). C'est pour ça qu'un processus orphelin est adopté par "init" (et non par son grand-père comme cela pourrait être imaginé ailleurs)
 
Sinon pstree existe aussi sous Linux.


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1064892
IrmatDen
Posté le 28-04-2005 à 21:12:51  profilanswer
 

Citation :

La notion de "petit-fils" n'existe pas sous Unix (et apparentés)


C'est bien ce que je craignais...
J'aurais aimer coder le nettoyage en C et éviter d'avoir un script à fournir en plus, pas par obligation, juste le challenge du tout C/C++ ;)
pstree m'a tout l'air d'être le complément parfait cependant.
Merci pour vos réponses :)
 
Edit:

Citation :

Note qu'il y a un truc qui va pas si les fils ne se tuent pas à la mort du père. Ils sont lancés par des nohup ?


Non, ils sont lancés tout ce qu'il y a de plus normalement. Et si, en continuant sur l'exemple précédent, j'envoie SIGTERM à dvdauthor, streamdvd est adopté aussi par init et je dois aussi lui envoyer SIGTERM manuellement.


Message édité par IrmatDen le 28-04-2005 à 21:19:44
n°1065258
IrmatDen
Posté le 29-04-2005 à 00:47:11  profilanswer
 

Yees  [:alucard]  
Je pensais que ça allait être bien plus dur en fait  :)  
 
Voilà la solution que j'utilise :
script cleanup-process avec en argument le pid du processus parent (que je détruis dans mon appli) :

Code :
  1. sons=`pstree -p $pidPere | tr -c 0-9 ' ' | tr -s ' '`
  2. for p in $sons; do
  3. [ $p != "0" -a $p != $pidPere ] && kill $p
  4. done


 
et je l'apelle depuis mon interface avec:

Code :
  1. system("sh cleanup-process " + pid)


 
J'aimerais savoir pour l'appel à system, s'il est préférable d'apeller avec "sh script" ou "./script" ? Et si le premier est dépendant du type de shell installé ? En ce qui concerne la sécurité, y a-t-il quelque chose à prévoir ?

n°1066294
Sve@r
Posté le 29-04-2005 à 22:03:29  profilanswer
 

IrmatDen a écrit :


Code :
  1. [ $p != "0" -a $p != $pidPere ] && kill $p



Utilises plutôt "-ne" pour comparer des numériques...

Code :
  1. [ $p -ne 0 -a $p -ne $pidPere ] && kill $p


 

IrmatDen a écrit :


J'aimerais savoir pour l'appel à system, s'il est préférable d'apeller avec "sh script" ou "./script" ?

Quasiment pareil. En appelant "sh script"; tu demandes au shell d'interpréter "script". En appelant directement "./script", ben tu demandes à exécuter "script" mais comme c'est un shell, le shell va l'interpréter
Juste que si tu fais "sh script", t'as pas besoin de mettre le droit "x" pour "script"
 

IrmatDen a écrit :

Et si le premier est dépendant du type de shell installé ?


Cette question pose un point capital en matière de portabilité. Si tu écris un script, tu ne l'écris pas que pour toi. Mais si tu l'écris en "csh" ben il faut que les autres soient en csh pour l'utiliser. OR, les autres sont à priori en n'importe quoi. Pour solutionner le pb, tu dois indiquer dans ton script quel est l'interpréteur utilisé. Cela se fait en début par la ligne

#!binaire qui a charge d'interpréter


 
par exemple, si tu écris un script en csh, tu dois mettre en début

#!/bin/csh


 
et si tu écris un script en bash, tu dois mettre en début

#!/bin/bash


 
Ainsi, quel que soit l'environnement de travail de celui qui exécute ton script, celui-ci sera interprété par le binaire inscrit dans cette fameuse ligne => ton script est portable et tu ne te préoccupes pas de l'endoit où tu l'installes
 

IrmatDen a écrit :

En ce qui concerne la sécurité, y a-t-il quelque chose à prévoir ?


Euh... que veux tu dire en "sécurité" ?


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1066460
IrmatDen
Posté le 30-04-2005 à 00:56:57  profilanswer
 

Sve@r a écrit :

Utilises plutôt "-ne" pour comparer des numériques...

Code :
  1. [ $p -ne 0 -a $p -ne $pidPere ] && kill $p


 
Quasiment pareil. En appelant "sh script"; tu demandes au shell d'interpréter "script". En appelant directement "./script", ben tu demandes à exécuter "script" mais comme c'est un shell, le shell va l'interpréter
Juste que si tu fais "sh script", t'as pas besoin de mettre le droit "x" pour "script"


ok, merci :)
 

Sve@r a écrit :

Cette question pose un point capital en matière de portabilité. Si tu écris un script, tu ne l'écris pas que pour toi. Mais si tu l'écris en "csh" ben il faut que les autres soient en csh pour l'utiliser. OR, les autres sont à priori en n'importe quoi. Pour solutionner le pb, tu dois indiquer dans ton script quel est l'interpréteur utilisé. Cela se fait en début par la ligne

#!binaire qui a charge d'interpréter


 
par exemple, si tu écris un script en csh, tu dois mettre en début

#!/bin/csh


 
et si tu écris un script en bash, tu dois mettre en début

#!/bin/bash


 
Ainsi, quel que soit l'environnement de travail de celui qui exécute ton script, celui-ci sera interprété par le binaire inscrit dans cette fameuse ligne => ton script est portable et tu ne te préoccupes pas de l'endoit où tu l'installes


Je l'ai écris en choississant /bin/bash comme interpréteur. Apparemment, il a l'air d'être présent sur la majorité des postes. Mais si quelqu'un n'a pas bash installé, y a-t-il moyen de se rabattre sur un autre interpréteur ?
 
 

Sve@r a écrit :

Euh... que veux tu dire en "sécurité" ?


En posant la question, je me suis dit que c'était peut-être un peu idiot. Mais dans le livre que j'utilise (prog  systeme en C sous Linux de C. Blaess), il y a un exemple d'appel :

Code :
  1. system("ls" );

qui peut permettre une attaque s'il est lancé avec un PATH modifié (d'où l'intérêt du ./ par rapport au sh), et (ce que j'avais lu un peu rapidement) si le programme appelant est setuid root. Comme ce n'est pas le cas de mon programme, la question ne se pose sans doute pas :whistle:

n°1066470
Elmoricq
Modérateur
Posté le 30-04-2005 à 01:04:39  profilanswer
 

Le set uid bit, c'est mal.

n°1066616
Sve@r
Posté le 30-04-2005 à 11:43:52  profilanswer
 

IrmatDen a écrit :

Je l'ai écris en choississant /bin/bash comme interpréteur. Apparemment, il a l'air d'être présent sur la majorité des postes. Mais si quelqu'un n'a pas bash installé, y a-t-il moyen de se rabattre sur un autre interpréteur ?


Pour être certain de la compatibilité descendante (ton programme marchera même sur des systèmes plus vieux) tu dois l'écrire en Bourne Shell (sans les subtilités ksh ou bash) et mettre "#!/bin/sh". Ton script fonctionnera partout.
 

IrmatDen a écrit :

Comme ce n'est pas le cas de mon programme, la question ne se pose sans doute pas :whistle:


Exact. Le programme sera exécuté avec les droits de l'utilisateur qui le lance. C'est pour cela qu'il est inutile de développer un virus sous Linux => il n'infectera que l'utilisateur qui le lance => d'où la remarque d'Elmoricq
 

IrmatDen a écrit :

Mais dans le livre que j'utilise (prog  systeme en C sous Linux de C. Blaess), il y a un exemple d'appel :

Code :
  1. system("ls" );

qui peut permettre une attaque s'il est lancé avec un PATH modifié (d'où l'intérêt du ./ par rapport au sh)


Le fait de mettre un répertoire devant le nom du script ("./script" ou
"/usr/bin/script" ) inhibe la variable PATH ce qui est une garantie supplémentaire. De plus, c'est pour éviter ce genre de traquenard que les bouquins de sécurité disent d'éviter de mettre "." dans le PATH de root et, surtout, si on le met quand-même, de ne jamais le mettre en premier.


Message édité par Sve@r le 30-04-2005 à 11:45:01

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1066840
IrmatDen
Posté le 30-04-2005 à 14:54:08  profilanswer
 

Ca y est les modif sont faîtes. Merci des infos :)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [RESOLU][linux] récupérer les fils de fils

 

Sujets relatifs
[JAVA]Récuperer tout les noeuds d'un JTree selectionnés[RESOLU][XSL]Creer un variable pour mettre un width="" pour un table
[C] Multiplication de polynômes. Ce code est-il OK ? [Résolu][JAVA] Petit problème de centrage [résolu]
Comment récupérer des variables ASP qu'on envoie à FLASH ?Config vitesse de communication série sous LINUX
[PB] Scanner de ports sous linux[Résolu] Envoie d'un mail en PHP
[RESOLU][XSL/JavaScript]problème d'intégration code JS dans le XSL[Java] Problème de compatibilité [Résolu]
Plus de sujets relatifs à : [RESOLU][linux] récupérer les fils de fils


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR