Multiplexage de sortie Linux

LinuxBeginner
Pratiquer maintenant

Introduction

La commande tee sous Linux est un outil puissant qui vous permet d'afficher la sortie d'une commande dans le terminal tout en la sauvegardant simultanément dans un fichier. Cette fonctionnalité est particulièrement utile pour les administrateurs système et les développeurs qui ont besoin à la fois d'inspecter la sortie en temps réel et de la conserver pour une analyse ultérieure.

Ce labo (LabEx) vous présentera les bases de la multiplexation de sortie à l'aide de la commande tee. Vous apprendrez à afficher la sortie et à la sauvegarder simultanément, à rediriger les erreurs standard et à ajouter la sortie à des fichiers existants. Ces compétences sont essentielles pour une gestion efficace des journaux (logs), le débogage et la surveillance des systèmes dans les environnements Linux.

Comprendre les bases de la commande tee

La commande tee sous Linux tire son nom de la pièce de tuyauterie en forme de T, qui divise le flux d'eau en deux directions. De même, la commande tee divise la sortie d'une commande en deux directions : vers le terminal et vers un fichier.

Commençons par nous rendre dans notre répertoire de travail :

cd /home/labex/project

Création d'un fichier de test

Tout d'abord, créons un simple fichier texte que nous pourrons utiliser pour nos expériences :

echo "Hello, World" > hello.txt

Cette commande crée un fichier nommé hello.txt contenant le texte "Hello, World".

Utilisation de la commande tee

Maintenant, utilisons la commande tee pour afficher le contenu de hello.txt dans le terminal tout en le copiant dans un autre fichier :

cat hello.txt | tee copy.txt

Vous devriez voir la sortie suivante dans votre terminal :

Hello, World

La partie cat hello.txt lit le contenu du fichier hello.txt. Le symbole de pipe | prend cette sortie et l'envoie à la commande tee. La commande tee affiche ensuite le texte dans le terminal et l'écrit simultanément dans le fichier copy.txt.

Vérifions que le contenu a bien été copié dans copy.txt :

cat copy.txt

Vous devriez voir la même sortie :

Hello, World

Comprendre la structure de la commande

La syntaxe de base de la commande tee est la suivante :

command | tee filename

Où :

  • command est n'importe quelle commande qui produit une sortie
  • | (pipe) envoie la sortie de la commande à tee
  • tee est la commande elle-même
  • filename est le nom du fichier où la sortie sera enregistrée

Rediriger les erreurs standard avec tee

Sous Linux, les programmes peuvent afficher des informations via deux principaux canaux :

  • Sortie standard (stdout): Sortie normale du programme
  • Erreur standard (stderr): Messages d'erreur et diagnostics

Par défaut, la commande tee ne capture que la sortie standard. Cependant, dans de nombreuses situations, vous pourriez également vouloir capturer les messages d'erreur. C'est là que la redirection de sortie entre en jeu.

Comprendre la redirection des erreurs standard

Créons un script qui affiche à la fois de la sortie standard et des erreurs standard. Rendez-vous d'abord dans le répertoire du projet (si vous n'y êtes pas déjà) :

cd /home/labex/project

Maintenant, exécutons une commande qui produira à la fois de la sortie standard et des erreurs standard :

echo "This is standard output"
ls /nonexistentfile

Vous devriez voir une sortie similaire à celle-ci :

This is standard output
ls: cannot access '/nonexistentfile': No such file or directory

Notez que le message d'erreur de la commande ls s'affiche directement dans le terminal.

Redirection des erreurs standard vers un fichier

Voyons d'abord comment rediriger uniquement la sortie d'erreur vers un fichier :

echo "This is standard output"
ls /nonexistentfile 2> error.log

Cette fois-ci, vous devriez seulement voir :

This is standard output

Le message d'erreur a été redirigé vers le fichier error.log. La syntaxe 2> indique au shell de rediriger les erreurs standard (descripteur de fichier 2) vers le fichier spécifié.

Vérifions le contenu de error.log :

cat error.log

Vous devriez voir :

ls: cannot access '/nonexistentfile': No such file or directory

Capture à la fois de la sortie et des erreurs avec tee

Maintenant, utilisons tee pour capturer à la fois la sortie standard et les erreurs standard dans un fichier tout en les affichant également dans le terminal :

{
  echo "This is standard output"
  ls /nonexistentfile
} 2>&1 | tee both.log

Vous devriez voir à la fois la sortie et l'erreur dans le terminal :

This is standard output
ls: cannot access '/nonexistentfile': No such file or directory

Vérifions le contenu de both.log :

cat both.log

Vous devriez voir la même sortie :

This is standard output
ls: cannot access '/nonexistentfile': No such file or directory

Comprendre la structure de la commande

Dans la commande 2>&1 | tee both.log :

  • { ... } regroupe plusieurs commandes ensemble
  • 2>&1 redirige les erreurs standard (descripteur de fichier 2) vers la sortie standard (descripteur de fichier 1)
  • | envoie la sortie combinée à la commande tee
  • tee both.log affiche la sortie dans le terminal et l'écrit dans le fichier both.log

Cette technique est particulièrement utile pour enregistrer la sortie des commandes lors de la maintenance du système ou du dépannage.

Ajouter la sortie avec tee

Par défaut, la commande tee écrase le fichier cible chaque fois qu'elle est utilisée. Cependant, dans de nombreux scénarios, vous pourriez vouloir ajouter de nouvelles informations à un fichier existant plutôt que de remplacer son contenu. C'est là que l'option -a (append, ajouter) s'avère pratique.

Comprendre l'option d'ajout

Rendez-vous dans le répertoire du projet si vous n'y êtes pas déjà :

cd /home/labex/project

Commençons par créer un fichier avec des informations sur le système :

uname -a | tee system_info.log

Cette commande affichera les informations sur votre système dans le terminal et les enregistrera dans le fichier system_info.log. La sortie ressemblera à ceci (votre sortie peut différer) :

Linux ubuntu 5.15.0-1031-aws #35-Ubuntu SMP Fri Feb 10 02:14:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

Maintenant, vérifions le contenu du fichier :

cat system_info.log

Vous devriez voir les mêmes informations sur le système.

Ajout d'informations au fichier

Maintenant, ajoutons plus d'informations à ce fichier en utilisant l'option -a :

echo "Date and time: $(date)" | tee -a system_info.log

Cela affichera quelque chose comme :

Date and time: Wed May 3 14:22:34 UTC 2023

Le drapeau -a indique à tee d'ajouter la sortie au fichier au lieu de l'écraser.

Vérifions à nouveau le contenu du fichier :

cat system_info.log

Vous devriez maintenant voir à la fois les informations sur le système et la date :

Linux ubuntu 5.15.0-1031-aws #35-Ubuntu SMP Fri Feb 10 02:14:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
Date and time: Wed May 3 14:22:34 UTC 2023

Ajout de plus d'informations

Ajoutons encore plus d'informations à notre fichier journal :

echo "Disk usage:" | tee -a system_info.log
df -h | tee -a system_info.log

Cela affichera les informations sur l'utilisation du disque et les ajoutera à notre fichier journal. La sortie variera en fonction de votre système, mais elle pourrait ressembler à ceci :

Disk usage:
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        19G  5.8G   13G  32% /
tmpfs           494M     0  494M   0% /dev/shm
tmpfs           198M  1.1M  197M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/sda15      105M  5.2M  100M   5% /boot/efi
tmpfs           100M  4.0K  100M   1% /run/user/1000

Vérifions une fois de plus le contenu de notre fichier journal :

cat system_info.log

Vous devriez maintenant voir toutes les informations que nous avons ajoutées :

Linux ubuntu 5.15.0-1031-aws #35-Ubuntu SMP Fri Feb 10 02:14:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
Date and time: Wed May 3 14:22:34 UTC 2023
Disk usage:
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        19G  5.8G   13G  32% /
tmpfs           494M     0  494M   0% /dev/shm
tmpfs           198M  1.1M  197M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/sda15      105M  5.2M  100M   5% /boot/efi
tmpfs           100M  4.0K  100M   1% /run/user/1000

Comprendre la structure de la commande

La syntaxe pour ajouter des données avec tee est la suivante :

command | tee -a filename

Où :

  • command est n'importe quelle commande qui produit une sortie
  • | (pipe) envoie la sortie de la commande à tee
  • tee est la commande elle-même
  • -a est l'option pour ajouter au fichier au lieu de l'écraser
  • filename est le nom du fichier où la sortie sera ajoutée

Cette approche est particulièrement utile pour :

  • Construire des fichiers journaux au fil du temps
  • Capturer la sortie de plusieurs commandes dans un seul fichier
  • Maintenir un enregistrement des états ou des opérations du système

Résumé

Dans ce laboratoire, vous avez appris à utiliser la commande tee pour la multiplexion de sortie sous Linux. Cette puissante utilitaire vous permet de visualiser la sortie des commandes dans le terminal tout en la sauvegardant simultanément dans des fichiers, ce qui en fait un outil essentiel pour les administrateurs système et les développeurs.

Voici les compétences clés que vous avez acquises :

  1. Utilisation de base de tee : Vous avez appris à utiliser tee pour afficher la sortie dans le terminal tout en la sauvegardant dans un fichier.

  2. Redirection des erreurs standard : Vous avez maîtrisé la capture à la fois de la sortie standard et des erreurs standard en utilisant la redirection 2>&1 en combinaison avec tee, ce qui est crucial pour une journalisation complète.

  3. Ajout de sortie : Vous avez découvert comment utiliser l'option -a avec tee pour ajouter la sortie à des fichiers existants au lieu de les écraser, vous permettant de construire des journaux de manière incrémentielle.

Ces techniques sont précieuses pour diverses tâches sous Linux, notamment :

  • La création de journaux détaillés pour le débogage
  • La surveillance des activités système
  • La documentation des sorties de commandes lors de l'administration système
  • La conservation des résultats des commandes pour une référence future

Comprendre comment gérer efficacement la sortie sous Linux est une compétence fondamentale qui vous sera très utile au fur et à mesure de votre progression avec les systèmes Linux.