Bonjour a tous,
Je suis face à un épineux problème et je vais encore une fois solliciter votre aide.
Le background :Je travaille sur un site web écrit en python hébergé par un serveur apache + mod_python sur une machine linux.
Quelque part dans mon code, j'ouvre un nouveau processus qui est destiné à continuer à tourner tout le temps (demon).
Le demon est donc un processus fils de la thread apache qui execute mon code python et, par consequant, est proprietaire de l'utilisateur www-data sur la machine unix.
J'ai pris soin de "zombifier" le demon pour qu'il ne soit pas tué dés que la thread apache s'arrete .
Jusqu'ici tout ce passe pour le mieux.
Le problème :Le problème arrive quand j'essaye de relancer apache alors que le demon qu'il a lui même lancé tourne toujours.
Le symptôme étant le suivant : apache me dit qu'il ne peut pas ouvrir une socket sur le port 80.
C'est a priori très étrange vu que apache est le seul à utiliser le port 80 et que, quand j'essaye de le redemarrer, il me dit ca alors qu'il est déjà éteint.
Je remarque également que si je coupe le demon, apache veut bien redemarrer. C'est là aussi tres étrange car le demon n'ouvre ni n'utilise le port 80 à aucun moment.
L'origine du problème :J'ai mis un bon moment a comprendre ce qu'il se passait et j'ai enfin trouvé :
Lorsque je lance le demon dans mon code python (exécuté par la thread apache), celui ci hérite de toutes les propriétés du processus père (sockets ouverte, fichiers ouverts, pipes... etc).
Et effectivement, lorsque je me promène dans /proc/PID_de_mon_demon/fd, j'y trouve effectivement une multitude de file descriptor ouverts qui correspondent à ceux qu'utilise apache (le file descriptor pour le fichier du log du serveur est particulièrement reconnaissable).
Ce comportement est, sauf erreur de ma part, immuable et typique de la gestion des processus sous unix.
La solution au problème :Je me retrouve maintenant a savoir exactement d'où vient le problème, il ne me reste plus qu'a le régler.
Je veux donc fermer la socket représentant la connexion sur le port 80 entre mon "fork" et mon "execvp" dans le processus fils.
C'est là que je bloque et que je vous demande de l'aide car je ne trouve pas le moyen de fermer cette socket.
Je ne connais pas a priori son numero de file-descriptor et je ne sais pas comment le trouver.
Les pistes que j'ai exploré :- J'ai d'abord pensé à aller le chercher à la main dans /proc/PID_du_demon/fd mais ce dossier n'est disponible qu'a l'utilisateur root et donc n'est pas lisible depuis du code lancé par apache.
- Puis j'ai essayé de trouver un autre moyen de lister tous les file-descriptor ouvert par le processus mais sans succés. Aurais-je mal cherché ?
- J'ai aussi chercher du coté de mod_python, il est peut etre possible de récuperer le socket apache depuis ce module mais encore une fois ne j'ai pas trouvé. Nottons que "J'ai pas trouvé" ne signifie pas "C'est pas possible"
Je suis bien évidement ouvert à toute solution qui aurait l'effet désiré
En espérant avoir été suffisamment clair sur la nature de mon problème,
restant a votre disposition pour tout complément d'information,
et en vous remerciant d'avance pour vos réponses,
Xavier
---
Le sage ne dit pas ce qu'il sait, le sot ne sait pas ce qu'il dit