Partage
  • Partager sur Facebook
  • Partager sur Twitter

Shell descriptor

    21 octobre 2016 à 12:31:43

    Bonjour,

    Je suis dans la situation suivante : 

    - Un script "wrapper"

    - Un script "task" qui possède une sortie standard &1 et d'erreur &2; appelé par le wrapper. 

    Je souhaiterai écrire dans un fichier : wrapper.stdout et wrapper.stderr; les sorties &1 et &2 de mon wrapper; tout en dissociant "task" et "wrapper" pour pouvoir sauvegarder &1 et &2 de ma "task" dans task.stdout et task.stderr

    Je pensais utiliser un troisième descripteur "poubelle" &3; un peu de ce genre

    exec 3<> /tmp/foo
    echo a >&3
    exec 3>&-
    

    Mais je n'arrive pas à afficher ce qui se passe dans "task" tout est sauvegarder dans /tmp/foo sans afficher biensur. Donc est-ce qu'il y aurait une sortie standard secondaire qui n'est pas commune avec &1 ?

    • Partager sur Facebook
    • Partager sur Twitter
      21 octobre 2016 à 12:44:07

      salut,

      c'est un peu difficile de se rendre compte.
      tu peux nous montrer ce qu'il se passe, ce que tu veux ...

      pourquoi task n''écrit-il pas directement ses sorties ?

      • Partager sur Facebook
      • Partager sur Twitter

      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

        21 octobre 2016 à 16:38:17

        Désolé, c'est pas évidentç
        J'ai oublié de préciser que j'utilise "tee" pour pouvoir à la fois sauvegarder dans un fichier et afficher!

        J'ai les taches qui sont lancées dans mon wrapper.
        Et je veux dissocier wrapper et tâches pour pas écrire en double.

        e.g. Le "wrapper" créé 5 tâches, je voudrai avoir:
        - wrapper.log
        - tache1.log
        - tache2.log
        - tache3.log
        - tache4.log
        - tache5.log

        Mais vu que wrapper appelle tache1, tache2, tache3, tache4, tache5. wrapper.log va contenir tache1,2,3..
        Je cherche à savoir si il y a une sortie standard alternative, qui me permet d'afficher mais qui ne soit pas &1 ou &2. Juste pour séparer les taches du wrapper quand j'écris wrapper.log

        • Partager sur Facebook
        • Partager sur Twitter
          21 octobre 2016 à 16:53:33

          on ne voit pas les choses de la même façon :
          #wrapper
          echo $0 >./$0.stdin 2>./$0.stderr
          ./task

          #task
          echo $0 >./$0.stdin 2>./$0.stderr


          • Partager sur Facebook
          • Partager sur Twitter

          Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

            22 octobre 2016 à 2:57:12

            Salut,

            Je retente une autre explication, je n'avais pas compris que tu voulais un exemple.

            Je rajoute juste une information, je suis obligé je lancer le wrapper.sh comme ça, car je travaille sur une grille de calcul !

            # commande à lancer
            ./wrapper.sh > ./wrapper.stdout 2> ./wrapper.stderr
            #!/bin/bash
            #wrapper.sh
            
            echo "HERE IS MY Wrapper.."
            echo "[ERROR] Dummy error message from wrapper.." >&2
            
            { { ./task.sh 1; } > >(tee ./task1.stdout ); } 2> >(tee ./task1.stderr >&2) 
            { { ./task.sh 2; } > >(tee ./task2.stdout ); } 2> >(tee ./task2.stderr >&2)
            { { ./task.sh 3; } > >(tee ./task3.stdout ); } 2> >(tee ./task3.stderr >&2)
            
            echo "End of wrapper.."
            echo "[ERROR] 2nd Dummy error message from wrapper.." >&2
            #!/bin/bash
            #task.sh echo "HERE IS MY task #$1.." echo "[ERROR] Dummy error message from task # $1.." >&2
            Je vous laisse lancer le script, actuellement voilà l'état de mon script. Mais je voudrais la sortie suivante :
            wrapper.stdout:
            
            HERE IS MY Wrapper..
            End of wrapper..
            
            wrapper.stderr:
            [ERROR] Dummy error message from wrapper..
            [ERROR] 2nd Dummy error message from wrapper..
            task1.stderr
            [ERROR] Dummy error message from task 1..
            
            task1.stdout
            HERE IS MY task #1..

            Donc concrètement est-ce qu'il y a une sortie alternative à stdout/stderr qui permet d'afficher, mais pas de ne pas avoir le message de task1,..N en DOUBLE, comme dans le cas présent ?
            • Partager sur Facebook
            • Partager sur Twitter
              22 octobre 2016 à 7:56:27

              je vais paraître borné :
              pourquoi ne pas attribuer à lui-même la gestion des sorties et des erreurs de chaque script. ?
              c'est-à-dire, que task s'occupe de ses messages et erreurs, et wrapper pareil.

              tu sembles vouloir simplifier le problème en faisant tout dans wrapper, mais ça complique tout, au contraire.

              mais peut-être est-ce la simplification pour l'exemple qui donne cette impression.

              PS :
              répéter une commande à l'identique est un bon moyen de faire une erreur lors de modifications ultérieures.
              tu pourrais l'écrire une fois dans une boucle, qui itérerait sur les arguments à passer à la commande, qui serviraient pour le nommage des fichiers de log.

              -
              Edité par dantonq 22 octobre 2016 à 7:57:26

              • Partager sur Facebook
              • Partager sur Twitter

              Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

              Shell descriptor

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown