IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

problème SO_REUSEADDR avec socket AF_UNIX [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut problème SO_REUSEADDR avec socket AF_UNIX
    bonjour,

    Je voudrais utiliser des sockets unix pour récupérer depuis différents workers des logs via logging.handlers.SocketHandler et les récupérer dans un process à part.
    Cependant je voudrais utiliser des sockets unix plutôt qu'un tuple host:port

    Le problème étant qu'il met impossible de ne pas me heurter à OSError: [Errno 98] Address already in use si je relance le processus.

    voici le code minimal de repro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import socketserver
     
    class H(socketserver.StreamRequestHandler):
        def handle(self):
            pass
     
    srv = socketserver.ThreadingUnixStreamServer("/tmp/log.sock", H)
    au deuxième lancement rien ne va plus


    Jusqu'à présent la question aurait plus de sens dans un forum unix, en faite ma vraie question c'est existe t'il un moyen build-in à socket ou socketserver de gérer ça sans que j'ai un faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try:
        os.remove("/tmp/log.sock")
    except FileNotFoundError:
        pass
    avant ?

    Je précise que socket.close() et socket.shutdown(2) n'ont rien changé

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par flapili Voir le message
    en faite ma vraie question c'est existe t'il un moyen build-in à socket ou socketserver de gérer ça sans que j'ai un faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try:
        os.remove("/tmp/log.sock")
    except FileNotFoundError:
        pass
    avant ?
    J'ai eu le même souci avec les fichiers sockets et j'ai utilisé la même solution (sans que ça ne me gêne plus que ça)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    finalement j'ai rajouté un ficher lock à l'aide de portalocker pour être sur de pas avoir de soucis si un second serveur se lance pendant que le 1er écoute déjà, plus qu'a utiliser /dev/shm et ça tourne

    J'ai essayé de voir si je ne pouvais pas utiliser directement /tmp/log.sock en tant que fichier de lock mais je n'ai pas l'impression, je peux faire un os.remove sans soucis même si j'ai déjà un serveur qui tourne

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par flapili Voir le message
    je peux faire un os.remove sans soucis même si j'ai déjà un serveur qui tourne
    Ouais, je viens de tester chez-moi. On peut même continuer le send() et recv() tout fonctionne nickel.
    On dirait que le fichier socket ne sert qu'à établir la liaison, ensuite tout se fait via le noyau Linux...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre chevronné
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 514
    Par défaut
    par mesure de précaution je vais quand même garder mon lock pour n'avoir qu'un process qui tourne

    mais est ce que si je fait le remove send() marche toujours après 30s, 3h ?
    Il faudrait que je me plonge dans la doc unix pour voir un peu le fonctionnement derrière

    ps: d'après la doc sur remove :
    on Unix, the directory entry is removed but the storage allocated to the file is not made available until the original file is no longer in use.
    tant que le fd est ouvert j'imagine que le programme continue de tourner comme si de rien était ?

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par flapili Voir le message
    tant que le fd est ouvert j'imagine que le programme continue de tourner comme si de rien était ?
    Ah oui, ça me rappelle un autre truc que j'ai découvert pour pouvoir réécrire en shell sur un fichier utilisé en lecture. Ca passe aussi par un remove.
    Exemple (shell): pour pouvoir reéécrire un "toto" quelconque qu'on veut aussi utiliser en lecture
    Code shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    exec 3<toto
    rm -f toto
    travail_quelconque (ex sort) 0<&3 >toto
    Le "rm -f toto" est impératif pour que la redirection finale crée un fichier neuf, mais le contenu de l'ancien fichier reste disponible dans le buffer n° 3. Et j'ai fait des tests sur des fichiers de plusieurs centaines de Mo (voire sur le Go) le truc fonctionne parfaitement.

    Probable que c'est un peu le même principe avec le fichier socket effacé après avoir été invoqué...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème réception avec socket
    Par toufik135 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 10/01/2014, 09h40
  2. Problème de QoS avec socket ssl java
    Par aaratorn dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 19/07/2007, 14h55
  3. [Socket] - Problème recv avec UTF8
    Par JuS80 dans le forum Réseau
    Réponses: 4
    Dernier message: 17/04/2007, 09h46
  4. problème chat avec socket/fork/pipe
    Par cedricdd dans le forum Réseau
    Réponses: 10
    Dernier message: 08/03/2007, 14h56
  5. Problème avec Socket et/ou Telnet sur le manager d'Asterisk
    Par gorby69 dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 21/07/2006, 14h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo