Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/01/2011, à 04:14

ehmicky

Logguer stdout et stderr

Salut à tous,
J'aimerais logguer le stdout et stderr du terminal. Cependant, lorsque je fais :

exec &> >(tee -a FILE)

La redirection semble faire que le terminal est reconnu comme étant "dummy" par des commandes comme less, qui ne fonctionnent alors plus. Y'a-t-il un moyen de résoudre ça ?
Merci ! smile


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#2 Le 26/01/2011, à 13:17

Totor

Re : Logguer stdout et stderr

je n'ai pas le net actuellement. Juste mon smartphone. Je ne serai donc pas bavard : FRUiT et moi avons traité de ce sujet l'année dernière (ou fin 2009) Essai de retrouver le fil ou demande-lui !


-- Lucid Lynx --

Hors ligne

#3 Le 26/01/2011, à 14:31

ehmicky

Re : Logguer stdout et stderr

Le fil est ici.
Je vais voir ça, merci smile


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#4 Le 26/01/2011, à 15:56

chopinhauer

Re : Logguer stdout et stderr

Une fois la manipulation effectuée tes commandes ne sont plus attachées à un terminal. Je suis un peu nul en ASCII art, mais essayons :

.
                      output1                        output2
o----------------o<------------o-----------------o<------------o------o
| gnome-terminal |    ptmx     | pseudo-terminal |   pts/X     | bash |
o----------------o------------>o-----------------o------------>o------o
                      input1                         input2

Cela est la situation normale, où l'input du clavier utilise les deux liens input1 et input2 pour arriver au bash, tandis que l'output du bash parcours les deux lignes en haut output2 et output1. Il y a souvent le echo activé ce qui branche input1 et output1 pour envoyer à l'écran ce qu'on entre dans le clavier. C'est possible tester via une ioctl sur le descripteur de fichier que l'autre côté est attaché à un terminal (ce que less fait)

Ce que tu fais est couper output2 en deux morceaux :

.
        o-----o
<-------| tee |<--------
        o-----o
           |
           |
           v
         fichier.txt

et au même temps tu détaches les logiciels du terminal. Certains peuvent être forcés à croire à la variable TERM comme ls --color=yes, d'autre ont besoin d'interroger plus le terminal (pour en connaître les dimensions par exemple) comme less (et man pour adapter le texte à la largueur de la page).

Une solution à ton problème serait de demander à l'émulateur de terminal de sauvegarder le résultat (ce que certains, e.g. xterm peuvent faire). Sinon il faudrait ouvrir un autre pseudo-terminal en ouvrant le périphérique maître (/dev/ptmx), trouver le périphérique esclave /dev/pts/X (on peut deviner là ou lister les périphériques avant et après), débloquer le périphérique esclave (appel unlockpt, à mon avis ce n'est pas faisable avec les outils standard) et construire une belle pipeline de sortie :

bash ----> nouveau pseudo-terminal ----> tee ----> ancien pseudo-terminal ----> gnome-terminal

Il faudrait regarder parmi tic, tac, toe et compagnie si quelqu'un peut débloquer le périphérique esclave.

Dernière modification par chopinhauer (Le 26/01/2011, à 15:59)


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#5 Le 26/01/2011, à 16:04

ehmicky

Re : Logguer stdout et stderr

Hum, merci pour ces infos, je vais me pencher là-dessus !


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#6 Le 26/01/2011, à 16:40

chopinhauer

Re : Logguer stdout et stderr

Cela dit débloquer un terminal esclave c'est rapide en C :

/* pty-helper */
#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    char *name;
    int fd;

    if (argc < 2) {
        fprintf(stderr,"Usage: pty-helper <ptmx fd>\n");
        exit(1);
    }

    fd = atoi(argv[1]);

    name = ptsname(fd);
    if (name) {
        printf("%s\n", name);
    }

    if (grantpt(fd)) {
        fprintf(stderr,"grantpt failed.\n");
        exit(1);
    }
    if (unlockpt(fd)) {
        fprintf(stderr,"unlockpt failed.\n");
        exit(1);
    }

    return 0;
}

Usage :

exec 4<>/dev/ptmx
pty-helper 4

Le nom de l'esclave sera retourné. Après il faudra jouer avec tput pour mettre l'ancien pseudo-terminal dans un état propre (pas de echo, transmission par caractère, pas ligne, etc…)


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#7 Le 06/02/2011, à 07:47

chopinhauer

Re : Logguer stdout et stderr

Je découvre lors de la mise à jour de mon serveur Debian la commande script (paquet bsdutils) qui fait la manipulation que je décrivais dans mon message précédent.


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne