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

Shell et commandes GNU Discussion :

Redirection bloquante


Sujet :

Shell et commandes GNU

  1. #21
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Alors la nouvelle version est:
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Fichier=res.json
    curl -o $fichier URL.fr || errCode=$?
    (($errCode)) && exit $errCode # on peut avoir un tableau qui reprend tous les code de sortie pour avoir un message explicatif...
    json_Reformat | awk -F ":" '(NR<11){next;} {$1=""; print &0}' <$fichier
    Écho "code : " $errCode
    Le problème est encore une fois sur la ligne json reformat, avec cette version il semble faire une boucle infinie.
    Après les différents tests que j'ai pu faire des que le json_reformat est séparé du Curl ça ne semble plus marcher.
    Je me demande si ce que je souhaite faire est vraiment possible

    PS: je n'ai plus de valeur dans la variable errCode

    MAJ 10H25: je suis sur le point de régler le problème de json reformat par contre toujours rien dans la variable errCode
    Dernière modification par Invité ; 30/07/2021 à 10h23.

  2. #22
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 677
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    je ne connais pas json_reformat, je ne sais pas ce qu'il attend comme entrée : le nom d'un fichier (json_reformat "$nomFichier", apparemment pas), ou le fichier lui-même (json_refomat <"$nomFichier" (ce qui devrait équivaloir à un pipe), ...).
    errCode n'est assigné qu'en cas d'échec ce curl; comme son nom le suggère, cette variable contient un code d'erreur
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #23
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 297
    Par défaut
    avec cette version il semble faire une boucle infinie.
    Parce qu'il attend une entrée que tu ne lui donnes pas. L'entrée devrait être $fichier. Le fait de le mettre en fin de ligne fait que awk reçoit le fichier; et tout ce qui est avant le pipe ne sert à rien (si ce n'est à tout bloquer). Il attend donc sur l'entrée standard, ici, le clavier.

    Quand la console attend une entrée, Ctrl+D finit et rend la main.

    Je me demande si ce que je souhaite faire est vraiment possible
    Comme on n'a jamais su ce que tu voulais faire, on ne peut pas t'aider. Harceler un serveur en demandant infiniment la même question est une bêtise. Et je reste poli.

  4. #24
    Invité
    Invité(e)
    Par défaut
    Salut Flodelarab et N_Bah,
    Merci pour vos réponses.
    J'ai effectivement résolu le problème de boucle infinie.

    @N_bah pou la variable errCode donc si le Curl tombe en Time Out ou autre chose il y a aura une valeur dans cette variable

    Donc si je veux rejouer le Curl en cas d'erreur il me suffit de faire un if en testant si la valeur de errCode est différente de 0 ou nulle?

    Parce que si la requête marche il n'y a pas de valeur dans la variable donc il faut peut être tester si errCode!=nulle?

  5. #25
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    par contre, pourquoi tenter de piper la sortie de curl si il échoue ? alors que la lecture d'un fichier peut n'être réalisée que quand la commande réussit !
    Si curl est bien fait, en principe, il s'arrête en cas d'erreur et surtout il clos ses FD, donc le pipe est fermé et les autres commandes s'arrêtent faute de participant.

    Dans le cas d'une redirection vers un fichier temporaire, il faudra à la toute fin, penser à supprimer celui-ci.

    Mais si le but est de boucler jusqu'à ce que curl retourne ok, soit il a une option de retry, soit rien n'empêche de lancer celui-ci dans un sous-shell pour intégrer la mécanique de bouclage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    { curl .... ; si error .... ; ... ; } | json_reformat | ....
    Et là, en plus, on peut justement utiliser un fd supplémentaire si on veut rajouter du printing autre que de l'erreur et qui n'entrera pas dans le pipe.

    Mais bon, votre approche est plus habituel et donc, disons, plus sereine

  6. #26
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 677
    Par défaut
    pou la variable errCode donc si le Curl tombe en Time Out ou autre chose il y a aura une valeur dans cette variable

    Donc si je veux rejouer le Curl en cas d'erreur il me suffit de faire un if en testant si la valeur de errCode est différente de 0 ou nulle?

    Parce que si la requête marche il n'y a pas de valeur dans la variable donc il faut peut être tester si errCode!=nulle?
    tu pourrais, comme je l'ai indiqué précédemment, mettre curl dans une boucle until ("jusqu'à réussite de la commande", et incrémentation d'une variable "maxRetry")...

    le test de la valeur de errCode est effectué par les parenthèses doubles.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #27
    Invité
    Invité(e)
    Par défaut
    Alors j'ai cherché sur le net pour la boucle until
    Je ne suis pas sûr d'avoir tout saisie car spontanément je ferais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Fichier=res.json
    Until [ $errCode != Null]
    Do
        curl -o $fichier URL.fr || errCode=$?
        (($errCode)) && exit $errCode # on peut avoir un tableau qui reprend tous les code de sortie pour avoir un message explicatif...
        json_Reformat<$fichier | awk -F ":" '(NR<11){next;} {$1=""; print &0}' >résultats.json
        echo "code : " $errCode
    Done
    - Le problème c'est que en faisant ça, errCode n'est pas encore déclaré ?
    - on est d'accord que l'ajout de maxretry n'est pas obligatoire ?

    Où bien je garde le premier Curl comme initialement puis je fais la boucle en testant (($errCode)) et je duplique le Curl?
    Dernière modification par Invité ; 30/07/2021 à 11h47.

  8. #28
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 677
    Par défaut
    tu dois formuler (en termes simples) le raisonnement AVANT de coder !
    Code pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    declare -i retry maxRetry=5
    until curl ...  || { errCode=$?; (( retry >= maxRetry ));}
    # ou bien
    # until curl ...  || errCode=$? && (( retry < maxRetry ))
    do
       retry+=1
       sleep ${delay:-1}
    done
    (( retry >= maxRetry )) && {
       >&2 echo "$maxRetry tentatives de téléchargement.
    dernier code d'échec de téléchargement : $errCode
    je quitte."
       exit $errCode
    }
    json_reformat "$fichier" | awk ...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #29
    Invité
    Invité(e)
    Par défaut
    Bonjour et merci pour ton aide.

    Alors si je comprends bien ton code.

    On fait le Curl, si le code retour est différent de 0 alors on fait errCode=$? && ((Retry < maxRetry))
    Donc dans cette seconde partie on analyse la première partie et si le code de retour est égal à 0 alors on test ((Retry < maxRetry))

    Je suppose que le Retry+1 et le sleep ne sont exécutés que si le Curl ne fonctionne pas.
    D'ailleurs à quoi correspond le sleep ${delay:-1}?
    Sur internet je trouve des sleep 10 ou autre mais rien avec une variable.

    Enfin à quoi correspond >&2 ?
    Pour moi &2 est le second argument donc je ne comprends pas ce bout de code

    Très bonne journée à tous

  10. #30
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 677
    Par défaut
    On fait le Curl, si le code retour est différent de 0 alors on fait errCode=$? && ((Retry < maxRetry))
    Donc dans cette seconde partie on analyse la première partie et si le code de retour est égal à 0 alors on test ((Retry < maxRetry))
    c'est ça.

    Je suppose que le Retry+1 et le sleep ne sont exécutés que si le Curl ne fonctionne pas.
    c'est ça.
    D'ailleurs à quoi correspond le sleep ${delay:-1}?
    ça indique une valeur par défaut (1) quand delay n'est pas défini. cf. man bash /Remplacement de paramètres
    Sur internet je trouve des sleep 10 ou autre mais rien avec une variable.
    toute donnée peut être "variabilisée".

    Enfin à quoi correspond >&2 ?
    c'est la sortie d'erreur.
    il existe, par défaut trois descripteurs de fichiers (file descriptor) pour gérer les entrées/sorties :
    0 entrée standard (stdin)
    1 sortie standard (stdout)
    2 sortie d'erreur (stderr)

    Pour moi &2 est le second argument donc je ne comprends pas ce bout de code
    le deuxième argument d'un script ou d'une fonction c'est $2
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #31
    Invité
    Invité(e)
    Par défaut
    C'est beaucoup plus clair.
    Je vous remercie tous pour votre aide et votre temps.
    En plus j'ai appris plein de choses

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Socket bloquante + redirection
    Par dvp_zero dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 10/03/2010, 20h21
  2. [API] Communication série NON-bloquante : OVERLAPPED/Thread
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/11/2003, 13h43
  3. [VB6] probleme de redirection d'une commande DOS
    Par WriteLN dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/06/2003, 09h36
  4. SendMessage bloquant l'exécution du programme
    Par Drooxy dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 03/05/2003, 19h26
  5. [reseaux] redirection de flux
    Par Olive1808 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 12/08/2002, 09h24

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