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

Linux Discussion :

rediriger les sorties de deux programmes dans le même fichier


Sujet :

Linux

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut rediriger les sorties de deux programmes dans le même fichier
    Bonjour,

    j'ai deux programmes qui communiquent entre eux par messages queues.
    Actuellement, les informations de la sortie standard des deux sont redirigées vers deux fichiers différents.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    prog1 >& file1
    prog2 >& file2
    Mais le problème c'est qu'il m'est impossible de faire de lien temporel entre ces deux fichiers, je voudrais donc les concaténer en respectant l'ordre d'écriture.

    Je pensais y arriver de la sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    prog1 >>& file1
    prog2 >>& file1
    mais le contenu de prog1 est au début, et celui de prog2 à la suite

    J'aimerais qu'il y ait un moyen facile de réaliser ceci

    Merci de votre aide, je continue de chercher de mon côté

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Salut,

    Es tu en mesure de changer le format de la sortie standard de tes programmes? Si oui, ajoute simplement un timestamp en debut de ligne, puis utilise ta premiere methode et

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    faut que je regarde si c'est possible et si ça prend pas trop de temps, c'est des fichiers assez énormes

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ashin Voir le message
    Bonjour,

    j'ai deux programmes qui communiquent entre eux par messages queues.
    Actuellement, les informations de la sortie standard des deux sont redirigées vers deux fichiers différents.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    prog1 >& file1
    prog2 >& file2
    Mais le problème c'est qu'il m'est impossible de faire de lien temporel entre ces deux fichiers, je voudrais donc les concaténer en respectant l'ordre d'écriture.
    Impossible. Si tu lances 2 processus pour écrire dans un fichier unique, au pire un des deux procesuss écrasera les datas de l'autre et au mieux t'auras les résultats à la suite l'un de l'autre.

    Citation Envoyé par Ashin Voir le message
    Je pensais y arriver de la sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    prog1 >>& file1
    prog2 >>& file1
    mais le contenu de prog1 est au début, et celui de prog2 à la suite
    Et voilà

    Citation Envoyé par Ashin Voir le message
    J'aimerais qu'il y ait un moyen facile de réaliser ceci
    Tu peux modifier les deux programmes pour qu'ils ajoutent un indicateur temporel dans leur résultat. Ensuite, tu fais un mix des résultats mais trié selon l'indicateur temporel.

    Ou bien tu écris un programme en C qui va créer 2 fils (fork)
    Chaque fils aura charge d'exécuter le programme et de récupérer son résultat via popen("prog", "r")
    Chaque fils écrira le résultat dans un fichier commun ouvert en mode "append". Il faudra qu'il ouvre, écrive et ferme le fichier pour que l'autre fils écrive son résultat à la suite
    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 averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    merci, je vais voir ce que donne les deux solutions, la performance ne doit pas être impactée significativement sinon ça ne vaut pas le coup.
    je posterais les résultats pour le suivi du sujet.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    La deuxième solution fonctionne bien (example sans le fork)

    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
    19
    20
    int main(void)
    {
     FILE * mut = NULL;
     FILE * vt = NULL;
     char ligne[TAILLE_MAX] = "";
     
     mut = popen("PGM","r");
     vt = fopen("trace_mixed.txt","a");
     
     while (fgets(ligne, TAILLE_MAX, mut) != NULL)
     {
      fprintf(vt,"%s", ligne);
     }
     
     fclose(vt);
     pclose(mut);
     
     return 0;
     
    }
    Cependant, avec fopen, le flux d'erreur n'apparait pas dans le fichier (il faudrait faire "PGM 2>&1")
    Or j'aimerais n'avoir que le flux d'erreur dans mon fichier

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Citation Envoyé par Ashin Voir le message
    Cependant, avec fopen, le flux d'erreur n'apparait pas dans le fichier (il faudrait faire "PGM 2>&1")
    Or j'aimerais n'avoir que le flux d'erreur dans mon fichier
    Tu donnes toi meme la solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mut = popen("PGM 2>&1","r");
    edit: enfin presque, ca redirige tout.
    Si tu veux quelque chose de plus fin, il te faura jouer du fork(), du close() et du dup() (en resume, recoder "ton" popen()).
    Ou bien ecrire un script shell qui redirige stderr vers stdout tout en fermant stdout (il faut pour cela utiliser exec, je n'ai pas d'exemple sous la main et je ne me sens pas d'ecrire ca de tete )

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tonton fred Voir le message
    Tu donnes toi meme la solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mut = popen("PGM 2>&1","r");
    edit: enfin presque, ca redirige tout.
    Si tu veux quelque chose de plus fin, il te faura jouer du fork(), du close() et du dup() (en resume, recoder "ton" popen()).
    Ou bien ecrire un script shell qui redirige stderr vers stdout tout en fermant stdout (il faut pour cela utiliser exec, je n'ai pas d'exemple sous la main et je ne me sens pas d'ecrire ca de tete )
    Ben non. Ta commande récupère stdout et stderr qui y est redirigé alors qu'il a dit qu'il ne voulait que stderr.
    Et là, je sèche. C'est la première fois que je vois ce besoin mais je vais un peu fouiller...

    [edit] Ca y est, j'ai trouvé
    mut=popen("(exec 3>&1; PGM 1>/dev/null 2>&3)", "r")

    On commence par créer un canal 3 qui ira au même endroit que le 1 (sur stdout). Puis on lances PGM en lui disant que le canal 1 va à la poubelle et en redirigeant le canal 2 vers le canal 3 (stdout). Et tout ceci dans un même processus d'où les parenthèses.
    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]

  9. #9
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ben non. Ta commande récupère stdout et stderr qui y est redirigé alors qu'il a dit qu'il ne voulait que stderr.
    ben c'est ce que j'ai ecrit dans mon edit non?
    Citation Envoyé par tonton fred Voir le message
    enfin presque, ca redirige tout. <...> ou ecrire un script shell qui redirige stderr vers stdout tout en fermant stdout (il faut pour cela utiliser exec, je n'ai pas d'exemple sous la main et je ne me sens pas d'ecrire ca de tete )
    (oui bon d'accord je sais pas le faire de tete mais j'etais pas loin)

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tonton fred Voir le message
    ben c'est ce que j'ai ecrit dans mon edit non?
    Mouais. C'est vrai que si on lit ton edit avec attention, tu le dis. Mais c'est pas courant d'avoir un post qui dit "ceci est la solution" et une ligne en dessous qui dit "pas tout à fait en fait". Bon bref...

    Citation Envoyé par tonton fred Voir le message
    (oui bon d'accord je sais pas le faire de tete mais j'etais pas loin)
    En fait, j'avais cette idée en tête en terminant mon début de post mais j'avais peur qu'en redirigeant 1 vers /dev/null et en redirigeant 3 vers 1, 3 aille aussi dans /dev/null. Donc j'ai bondi sur mon Linux et tapé cette ligne de test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (exec 3>&1; rm -f /etc/passwd 1>/dev/null 2>&3) |rev
    Et j'ai eu la joie de voir apparaitre le message d'erreur à l'envers prouvant que le canal 2 avait traversé le pipe.
    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]

Discussions similaires

  1. Décalage des champs à l'écriture de deux sources dans un même fichier .csv
    Par justinedr71 dans le forum Développement de jobs
    Réponses: 8
    Dernier message: 27/07/2011, 18h09
  2. [WD14] Exporter deux tables dans un même fichier Excel
    Par Pownee dans le forum WinDev
    Réponses: 2
    Dernier message: 21/09/2009, 09h10
  3. Réponses: 1
    Dernier message: 13/11/2008, 12h08
  4. rediriger les résultats d'un programme dans un fichier avec format spécifié
    Par condor_01 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 27/11/2007, 20h55
  5. Rediriger la sortie d'un programme vers un fichier
    Par olive_le_malin dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 23/11/2005, 09h55

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