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. #1
    Invité
    Invité(e)
    Par défaut Redirection bloquante
    Bonsoir,

    J'essaie de faire des curl mais je veux récupérer le code retour http pour relancer les curl en erreur comme timed out.
    J'ai trouvé un bout de code qui fonctionne bien, par contre, le reformat_json ne fonctionne plus avec cette façon de faire , le code à droite du pipe n'est pas exécuté.

    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # creates a new file descriptor 3 that redirects to 1 (STDOUT)
    exec 3>&1
     
    HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://URL.fr' | json_reformat | awk -F ":" '{ $1 = "" ; print $0 }' |sed '1,10d')
     
    echo "HTTP_STATUS : "$HTTP_STATUS

    Je récupère bien le code retour dans HTTP_STATUS mais à partir du json_reformat rien ne semble s'exécuter.

    Une idée pour permettre que ce bout de code soit exécuté ?

    Merci par avance.
    Dernière modification par N_BaH ; 30/07/2021 à 15h13.

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 408
    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 408
    Par défaut
    En fait, tu te complique la vie, le pipe ne concerne que le stdout et comme ici tu utilises le fd 3 et non le fd 1 , le pipe ne voit rien.

    Pour faire plus simple, tu as la variable (tableau) PIPESTATUS qui te donne le status de chaque commande du pipeline (mais on ne peut la lire qu'en une seule fois) :

    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
    16
    17
    18
    $ false | true | false | false | true
    $ echo ${PIPESTATUS[0]}
    1
    $ echo ${PIPESTATUS[1]}
     
    $ false | true | false | false | true
    $ echo ${PIPESTATUS[@]}
    1 0 1 1 0
    $ echo ${PIPESTATUS[@]}
    0
    $ false | true | false | false | true
    $ xx=(${PIPESTATUS[@]})
    $ echo ${xx[0]}
    1
    $ echo ${xx[1]}
    0
    $ echo ${xx[2]}
    1

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut et merci de ta réponse.
    Depuis j'ai remplacé &1 par un nom de fichier : res.json

    Je comprends que le pipe n'est pas pris en compte.
    Mais j'ai absolument besoin de reformater en json comme indiqué après le pipe car il y a un traitement qui va en découler.
    Je pense que c'est possible de le faire hors de la requête en lisant le fichier et le modifiant mais j'ai peut que ça ajoute beaucoup de temps d'exécution.
    Est-ce qu-il y aurait une façon de faire?

    Sauf si je dois remplacer le 3 par 1 (stdout)?
    Merci

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 299
    Par défaut
    Bonjour

    En vrac :


  5. #5
    Invité
    Invité(e)
    Par défaut
    Salut,
    Merci pour ta réponse.
    Le json_reformat est une commande bash à ce que j'ai compris.
    Les 10 première lignes du json sont enlevées car je besoin que des valeurs a partir de la 11 lignes pour faire des calculs.
    Concernant le type de timeout c'est une bonne question et pour être honnête je n'en sais rien.
    Après pour le pipe je ne vois pas comment je peux adapter le code que j'ai et qui marche bien pour reformater le json

  6. #6
    Invité
    Invité(e)
    Par défaut
    J'ai en tête de faire qu'une seule commande parceque si je fais 2 commandes avec les curls la première peut très bien fonctionner mais la deuxième tomber en timeout c'est pour ça que le code initial était intéressant

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 408
    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 408
    Par défaut
    A quoi ressemblait ton code avant de vouloir récupérer le statut pour le rejouer en cas de problème ?

  8. #8
    Invité
    Invité(e)
    Par défaut
    Je n'avais que cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl 'http://URL.fr' | json_reformat | awk -F ":" '{ $1 = "" ; print $0 }' |sed '1,10d'
    Dernière modification par N_BaH ; 29/07/2021 à 16h08.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 713
    Par défaut
    Citation Envoyé par flash026 Voir le message
    je veux récupérer le code retour http
    qu'appelles-tu "code de retour http" ?

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 408
    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 408
    Par défaut
    Ok, et pourquoi donc pas ça, si on s'appuie aussi sur ton premier post:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    curl 'http://URL.fr' | json_reformat | awk -F ":" '{ $1 = "" ; print $0 }' |sed '1,10d'
    HTTP_STATUS=${PIPESTATUS[0]}

  11. #11
    Invité
    Invité(e)
    Par défaut
    J'entends par code retour http: 200 0k et tout ce qui n'est pas 200 = problème
    Je fais donc faire un if sur http_status.

    Alors avec ce code je ne récupère plus le code 200 mais juste une valeur de 0

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 713
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Ok, et pourquoi donc pas ça, si on s'appuie aussi sur ton premier post:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    curl 'http://URL.fr' | json_reformat | awk -F ":" '{ $1 = "" ; print $0 }' |sed '1,10d'
    HTTP_STATUS=${PIPESTATUS[0]}
    en effet, c'est à ça que je pensais : curl a des codes de sortie différents selon l'erreur qu'il a rencontrée.

    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 !
    donc :
    Code Pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fichier=/chemin/fichier.html
    curl ... || errCode=$?
    (($errCode)) && exit $errCode # on peut avoir un tableau qui reprend tous les code de sortie pour avoir un message explicatif...
    jsonReform "$fichier" | awk ...

  13. #13
    Invité
    Invité(e)
    Par défaut
    Merci de ton retour.
    Avec ton code la requête est réalisée donc ça c'est cool par contre le json_reformat ne marche pas.
    Json_reformat: reformat json from stdin usage: json reformat [options]
    D'ailleurs le fichier que j'ai déclaré dans la variable : résultats.json n'est même pas créé

    De plus je me demande, avec ce code on récupère le code Curl dans &errCode?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 713
    Par défaut
    avec ce code on récupère le code Curl dans &errCode?
    c'est ça, ou presque, c'est dans $errCode.

    montre-nous le code que tu testes, stp.

  15. #15
    Invité
    Invité(e)
    Par défaut
    Voilà le code que j'exécute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Curl 'url.fr'|json_reformat | awk -F ":" '(NR<11){next;} {$1=""; print &0}' >result.json ||errCode=$?
    (($errCode)) && exit $errCode
    Écho "code : " $errCode
    Avec cette version j'arrive maintenant à écrire dans le fichier avec la bonne forme, mais rien n'est mis dans la variable errCode
    Dernière modification par al1_24 ; 29/07/2021 à 19h00. Motif: Balises CODE

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 713
    Par défaut
    ça ne correspond pas à la méthode que j'ai proposée :
    - on fait le curl, tout seul*, et s'il échoue on enregistre son code d'erreur
    - on teste s'il existe un code d'erreur, ET s'il est supérieur à zéro, on quitte le script
    - ensuite, on traite le fichier obtenu avec json_reformat.

    --
    * on peut éventuellement le mettre dans une boucle until, adjointe d'un compteur pour stopper la boucle en cas de succès, ou quand le nombre max de tentatives a été atteint

  17. #17
    Invité
    Invité(e)
    Par défaut
    Alors en utilisant ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Fichier=pwd/res.json
    curl 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}'
    Écho "code : " $errCode
    Mais ça bloque au niveau du json_reformat en mettant ou non la variable fichier
    Dernière modification par al1_24 ; 29/07/2021 à 19h27. Motif: Balises CODE

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 713
    Par défaut
    il faut indiquer le fichier de sortie à curl, ainsi que (le même ) en entrée à json_reformat !

  19. #19
    Invité
    Invité(e)
    Par défaut
    Pour Curl avec l'option -o je suppose.
    Par contre pour json_reformat j'ai mis juste après $fichier mais ça ne fonctionnait pas

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 713
    Par défaut
    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), ...).

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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, 21h21
  2. [API] Communication série NON-bloquante : OVERLAPPED/Thread
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/11/2003, 14h43
  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, 10h36
  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, 20h26
  5. [reseaux] redirection de flux
    Par Olive1808 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 12/08/2002, 10h24

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