J'ai un programme serveur sur un linux qui "écoute" sur un port TCP spécifique. Il est susceptible de recevoir des informations depuis d'autres plates-formes sur le réseau. Chaque connexion fait l'objet d'un thread. Cela fonctionne correctement dans l'ensemble, sauf lorsque le trafic devient important. Dans ce cas, le programme se plante en "segmentation fault". A première vue, il semblerait que les buffers des données se mélangent entre eux sur différents threads. En attendant de trouver l'erreur (cela risque d'être long étant donnée la taille du programme), je voudrais redémarrer le programme lorsqu'il se plante. J'ai donc fait la chose suivante :
- Interception des signaux de fin de programme.
- En cas de SIGSEGV, je fais un fork.
- Dans la partie père je m'arrête.
- Dans la partie fils je lance le redémarrage par "service nom_démon restart" via execlp.
- La commande s'exécute mais au démarrage le programme se plante lorsqu'il veut à nouveau écouter sur le port.
C'est comme si le port était encore utilisé, alors qu'à priori execlp devrait écraser l'environnement.
Si quelqu'un a une idée ou pourrait me suggérer une autre solution de redémarrage. Je ne voudrais pas utiliser un programme de surveillance.
Merci. Salut.
# Ca va trop vite?
Posté par totof2000 . Évalué à 2.
A mon avis ton service tente de redemarrer alors que le pgm pere n'est pas encore completement redemarre.
Tu devrais mettre un sleep à ton script de démarrage, tout au moins pour tester.
Je ne voudrais pas utiliser un programme de surveillance Simple curiosite, pourquoi?
Et pourquoi ne pas lancer ton programme serveur via l'inittab avec un respawn?
[^] # Re: Ca va trop vite?
Posté par mitteljc . Évalué à 1.
2. La gestion du programme de surveillance est embêtante dans le sens où lorsque j'arrête le programme volontairement, il faut penser à arrêter la surveillance.
3. J'évite l'inittab car je trouve la gestion par chkconfig bien plus souple.
Merci.
# OK, trouvé
Posté par mitteljc . Évalué à 2.
int fid;
for( fid = getdtablesize(); fid > 2; fid-- ) close(fid);
# \_o<
Posté par doublehp (site web personnel) . Évalué à 1.
- demon wotchdog ... qui reboot softwarement le PC quand il pense que le kernel est HS, mais pas trop trop , quand pas de kernel panic)
- panic=30 (argument du noyeau ... en cas de kernel panic)
- une machine ethernet qui attend des ping, et qui desactive l alim 220 du sevre cense emettre via un montage de type 'machine a cafee' ... le probleme est que des fois tout est HS, mais ce demon la peut encore marcher ... on a meme vu des machines repondre au ping meme apres un KP.
[^] # Re: \_o<
Posté par phoenix (site web personnel) . Évalué à 2.
[^] # Re: \_o<
Posté par doublehp (site web personnel) . Évalué à 2.
Kernel Panic.
[^] # Re: \_o<
Posté par phoenix (site web personnel) . Évalué à 2.
[^] # Re: \_o<
Posté par phoenix (site web personnel) . Évalué à 2.
En faite, quelqu'un ma dit que toute les carte mère avait une Watchdog. Je me demandais si c'était vrai.
Pourriez-vous m'éclairer ?
[^] # Re: \_o<
Posté par doublehp (site web personnel) . Évalué à 3.
si c est une ISA, ca doit etre chaud a configurer, et je pense pas que le BUS ISA permette de faire le reset hard necessaire.
Apres, si ce n est ni PCI ni ISA, je vois pas ce que ca peut etre ... i2c ? SMBus ?
je n ai jamais eu vent de ce que tu raconte ... du moins pas un watchdog hard ...
par contre, ce qui est vrai, c est que quasiment tous les CPU en ont un ... on s en sert beaucoup dans les micro controleurs en electronique, pour faire redemarrer automatiquement les circuits plantogenes.
Donc que les CPUs x86 aient un watchdog interne, la je pense que c est vrai, mais une carte watchdog, je pense pas.
Les deux s utilisent differement.
# port bloque
Posté par nanard . Évalué à -1.
effectivement le port n'est pas liberer de suite.
En fait cela peut ce changer avec une option ( qui l'eu crue!)
Desoler de tete je ne peut pas te dire comment, mais si personne ne te repond promis la prochaine fois je te sort la doc !!
Allez tous vous faire spéculer.
# redemarrer en cas de plantage
Posté par nanard . Évalué à 0.
il te faut modifier les options du socket avec la commande 'setsocketopt(int socket, int niveau, int option, const void valeur, socklent_t size)'
1er arg la socket
2eme arg protocol desirer ( SOL_SOCKET ) la socket elle meme
3eme arg l'option qu'il te faut SO_REUSEADDR (permet de reutiliser l'addresse, il y a d'autre option: man setsocketoptest ton ami :-))
en gros un < setsocketopt(sock, SOL_SOCKET, SO_REUSEADDR, 1, sizeof(int)) > devrais etre la phrase magique.
Allez tous vous faire spéculer.
[^] # Re: redemarrer en cas de plantage
Posté par mitteljc . Évalué à 1.
Salut.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.