Forum Programmation.c Redémarrer un serveur en cas de plantage

Posté par  .
Étiquettes : aucune
0
3
août
2005
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  . Évalué à 2.

    C'est comme si le port était encore utilisé, alors qu'à priori execlp devrait écraser l'environnement

    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  . Évalué à 1.

      1. Pour ce qui est du sleep. J'avais déjà testé avec un sleep de 10 s avec le même résultat.
      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  . Évalué à 2.

    En fait, execlp n'écrase pas l'environnement. Par fork, le fils hérite de l'environnement du père (dont les fichiers ouverts comme les sockets) et il reste présent avec execlp. Donc le socket restait ouvert. Par mesure de sécurité, avant l'execlp, je ferme tout les fichiers susceptibles d'être ouverts (sauf les standards) :
    int fid;
    for( fid = getdtablesize(); fid > 2; fid-- ) close(fid);
  • # \_o<

    Posté par  (site web personnel) . Évalué à 1.

    - carte watchdog hard ( une carte PCI qui reset en cas de plantage)
    - 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  (site web personnel) . Évalué à 2.

      un KP ? C'est quoi ?
    • [^] # Re: \_o<

      Posté par  (site web personnel) . Évalué à 2.

      J'ai déjà vu dans le noyau Linux, la possiblité de configurer une watchdog. Je me suis demandé si je pouvais supprimer son utilisation.
      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  (site web personnel) . Évalué à 3.

        bah, j ai jamais vu une telle chose dans 'lspci' ...

        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  . Évalué à -1.

    < C'est comme si le port était encore utilisé, >

    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  . Évalué à 0.

    Bon comme promis voila comment reutiliser de suite ton socket quand ton prog plante.
    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  . Évalué à 1.

      Merci, ça a l'air de répondre à mon besoin. Pour précision, il faut lire "setsockopt" et non "setsocketopt". J'ai eu du mal à trouver le "man setsocketopt" ;-)

      Salut.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.