La commande tail de Linux est l’un des outils es­sen­tiels de l’interface en ligne de commande. La fonction prin­ci­pale de cette commande est d’afficher la fin d’un fichier (texte), autrement dit de limiter la sortie d’une commande Linux à un certain nombre de lignes. La commande tail fait donc partie d’une série qui inclut la commande head de Linux et les commandes 'cat' et 'less'. Les commandes Linux servent toutes à afficher le contenu de fichiers texte.

La commande tail de Linux ap­par­tient aux uti­li­taires de base (Coreutils) GNU. Il s’agit d’une col­lec­tion de commandes de base pour l’interface en ligne de commande qui sont incluses dans le système de commande open source Linux. Les Coreutils sont publiés sous licence open source et sont dis­po­nibles en té­lé­char­ge­ment pour une variété de systèmes d’ex­ploi­ta­tion dif­fé­rents.

Raison d’être de la commande tail de Linux

La fonction élé­men­taire de la commande tail de Linux est d’afficher la fin d’un fichier. Il faut savoir que les données écrites dans un fichier se re­trou­vent à la fin du fichier. La commande tail de Linux permet par con­sé­quent de vérifier si de nouvelles données ont été ajoutées à un fichier. C’est pourquoi elle est appréciée pour analyser les fichiers log.

De nombreux pro­grammes, notamment les serveurs Web comme Apache ou nginx, écrivent des in­for­ma­tions d’état dans ce que l’on appelle des fichiers journaux. Dans le cas des journaux de serveur, les fichiers con­tien­nent, entre autres, un ho­ro­da­tage, l’URL de la ressource demandée et l’adresse IP de la partie re­qué­rante.

Les fichiers journaux s’agran­dis­sent à chaque requête et de­vien­nent de plus en plus vo­lu­mi­neux. Pour limiter leur taille au-delà d’un certain point, les fichiers journaux font ha­bi­tuel­le­ment l’objet d’un « roulement ». Le fichier journal est compressé et archivé sous un nouveau nom, et un nouveau fichier journal vide est créé sous le nom d’origine. Voici un aperçu des fichiers journaux courants sous Ubuntu Linux :

Fichier journal Ubuntu Linux Ex­pli­ca­tion
/var/log/auth.log Journal d’au­to­ri­sa­tion Linux
/var/log/daemon.log Journal du daemon Linux
/var/log/debug Journal de débogage Linux
/var/log/kern.log Journal du noyau Linux
/var/log/syslog Journal du système Linux
/var/log/apache2/access.log Accès aux contenus du serveur Web Apache2
/var/log/apache2/error.log Messages d’erreur du serveur Web Apache2

Appel de la commande tail de Linux dans l’interface en ligne de commande

La commande tail de Linux est appelée dans l’interface en ligne de commande. Comme il est d’usage, le nom de la commande est saisi, suivi de pa­ra­mètres fa­cul­ta­tifs. La séquence se termine par le nom ou le chemin d’un ou de plusieurs fichiers. Pour commencer, voyons comment écrire un cas général :

tail [options] <fichiers>

Sans options, la séquence la plus simple de la commande tail de Linux est la suivante :

tail <fichier>

Appelée de cette manière, la commande tail de Linux affiche les dix dernières lignes du fichier spécifié. C’est utile pour vi­sua­li­ser les données les plus récentes écrites dans le fichier.

Options de base de la commande tail de Linux

La commande tail de Linux peut être contrôlée par des pa­ra­mètres. Les Coreutils com­pren­nent une forme longue pour chaque option et une forme abrégée pour les options les plus fré­quem­ment utilisées. Le tableau ci-dessous donne un aperçu des options les plus utiles :

Option (forme abrégée/forme longue) Ex­pli­ca­tion
-n / --lines Limiter la sortie aux dernières lignes n/limiter la sortie aux lignes suivantes à partir de la ligne n 
-c / --bytes Limiter la sortie aux derniers octets n/limiter la sortie aux octets suivants à partir de l’octet n 
-q / --quiet, --silent Supprimer la sortie des noms de fichiers lorsqu’il y a plusieurs fichiers
-v / --verbose Forcer la sortie des noms de fichiers lorsqu’il y a plusieurs fichiers
--help Afficher les in­for­ma­tions d’aide de la commande
--version Afficher les in­for­ma­tions sur la version de la commande
Note

La commande tail de Linux est conçue avant tout pour traiter les fichiers texte utilisant le jeu de ca­rac­tères ASCII. Un caractère cor­res­pond alors exac­te­ment à un octet. Si vous manipulez des fichiers en Unicode avec l’option '-c' de la commande tail de Linux, des effets se­con­daires inat­ten­dus pour­raient survenir.

Options avancées de la commande tail de Linux

Les options de base de la commande tail de Linux pré­sen­tées pré­cé­dem­ment fonc­tion­nent de manière identique à celles de la commande head. À ceci près que la commande head affiche le début d’un fichier, tandis que tail en affiche la fin. Mais la commande tail peut aller beaucoup plus loin.

En par­ti­cu­lier, elle fournit de multiples options pour suivre les mo­di­fi­ca­tions apportées aux fichiers. Avec la commande tail de Linux, les données ajoutées à la fin du fichier peuvent être affichées en continu. Il s’ensuit que tail est par­ti­cu­liè­re­ment adaptée au suivi des fichiers journaux. Ce processus est connu sous le nom de « live tail » (« queue en direct » en français). Voici un aperçu des options les plus cou­ram­ment utilisées :

Option (forme abrégée/forme longue) Ex­pli­ca­tion
-f / --follow=[{name|des­crip­tor}] Sur­veil­ler les mo­di­fi­ca­tions du fichier et afficher en continu les nouvelles données écrites à la fin du fichier. Sans spécifier de valeur après '--follow=', 'des­crip­tor' est utilisé comme valeur par défaut. Cela signifie que la live tail con­ti­nuera même si le fichier est renommé ou déplacé.
-F Cor­res­pond à l’appel avec --follow=name –retry ; l’effet est que la live tail continue même si le fichier original est supprimé dans le cadre du roulement du journal et remplacé par un nouveau fichier portant le même nom.
-s / --sleep-interval=N Suspendre la sortie pendant le nombre de secondes spécifié.
--retry Essayer de rouvrir un fichier in­dis­po­nible dès qu’il redevient dis­po­nible. Très pratique en com­bi­nai­son avec l’option '--follow=name' pour continuer à sur­veil­ler le nouveau fichier du même nom après le roulement d’un fichier journal.
--pid=PID Lorsqu’elle est utilisée avec l’option -f, la commande tail prend fin quand le processus portant l’ID de processus spécifié se termine. Utile pour in­ter­rompre la live tail lorsque le programme qui écrit dans le fichier prend fin.

Exemples d’uti­li­sa­tion de la commande tail de Linux

Dans la do­cu­men­ta­tion des Coreutils, la commande tail de Linux figure dans la section « Output of parts of files » (sortie de parties de fichiers). Le terme « fichiers » s’entend ici au sens large. « Flux de texte » serait plus exact.

Con­for­mé­ment à la phi­lo­so­phie Unix, les commandes de l’interface en ligne de commande utilisent les flux de texte comme format universel d’entrée et de sortie. Les flux de texte sont surtout des fichiers, mais aussi des entrées et sorties standard de la ligne de commande. Par ailleurs, les « pipes » (« tubes » en français) revêtent une grande im­por­tance. En effet, ils per­met­tent d’enchaîner plusieurs commandes. La sortie d’une commande est alors trans­fé­rée comme entrée à la commande suivante.

L’idée d’enchaîner plusieurs commandes découle de la phi­lo­so­phie Unix. Plutôt que de dé­ve­lop­per des commandes complexes pour des tâches en­tiè­re­ment dif­fé­rentes, il existe un ensemble re­la­ti­ve­ment succinct de commandes générales. Suivant la devise « Fais une chose et fais-la bien », chaque commande a une fonc­tion­na­lité étroi­te­ment délimitée. Les commandes utilisent les flux de texte comme interface uni­ver­selle et peuvent être combinées pour créer des solutions toujours nouvelles.

Note

Dans les exemples suivants, quand nous appelons la commande tail de Linux, nous utilisons les options dans leur forme abrégée ('-n' au lieu de '--lines', etc.). Vous ren­con­tre­rez souvent cet usage lorsque vous lirez d’autres do­cu­men­ta­tions ou exemples de code.

Exemples généraux d’uti­li­sa­tion de la commande tail de Linux

Les exemples généraux suivants utilisent les options de base de la commande tail de Linux pré­sen­tées au début. Pour des exemples d’uti­li­sa­tion des options avancées, lisez la partie sur la sur­veil­lance des fichiers journaux ci-dessous.

La plupart des exemples combinent la commande tail à une ou à plusieurs autres commandes Linux. Les pipes sus­men­tion­nés servent à reprendre la sortie d’une commande comme entrée de la commande suivante.

Sortir la fin d’un fichier à l’aide de la commande tail de Linux

Dans le cas le plus simple, on utilise la commande tail de Linux pour sortir les dernières lignes d’un fichier. Pour l’essayer, remplacez le caractère générique '<fichier>' par le nom ou le chemin d’un fichier texte présent sur votre système. Ici, nous utilisons l’option -n et nous sortons les trois dernières lignes d’un fichier :

tail -n 3 <fichier>

Il est souvent utile de garder à l’esprit le contexte du fichier traité avec la commande tail. Pour sortir les lignes avec des numéros de ligne, nous traitons d’abord le fichier avec la commande nl (qui signifie « line numbering », soit « nu­mé­ro­ta­tion de ligne »), et nous trans­fé­rons la sortie à la commande tail à l’aide d’un pipe :

nl <fichier> | tail -n 3

Sortir les dernières commandes utilisées dans la ligne de commande

La commande history affiche les commandes saisies dans la ligne de commande. Ce sont souvent les derniers appels qui ont un intérêt. De surcroît, une sortie complète de l’his­to­rique des commandes pourrait révéler des données sensibles. Ici, nous trans­fé­rons la sortie de la commande history à la commande tail et nous sortons les cinq dernières lignes :

history | tail -n 5

Supprimer les plus anciens fichiers de sau­ve­garde d’un ré­per­toire avec la commande tail

Voyons main­te­nant un exemple plus complexe. Nous allons supprimer les dix fichiers les plus anciens d’un ré­per­toire contenant des fichiers de sau­ve­garde. Pour ce faire, nous utilisons les quatre commandes Linux 'ls', 'tail', 'xargs' et 'rm' :

ls -t *.bak | tail | xargs rm

Que se passe-t-il exac­te­ment ici ?

  1. La commande ls liste les fichiers du ré­per­toire.

Avec l’option '-t', les fichiers sont triés par date de mo­di­fi­ca­tion. Les fichiers les plus anciens se re­trou­vent en bas de la liste.

Nous employons le schéma de recherche '*.bak' pour la source de données. Il s’agit d’une extension de fichier courante pour les fichiers de sau­ve­garde. C’est, de plus, un moyen de se protéger afin d’éviter une sup­pres­sion ac­ci­den­telle de fichiers im­por­tants.

Nous trans­fé­rons la liste des fichiers à la commande tail à l’aide d’un pipe.

  1. En utilisant la commande tail sans indiquer d’options, nous sortons les dix derniers fichiers de la liste. Les noms de fichier affichés sont les fichiers les plus anciens du ré­per­toire.
  2. La commande xargs récupère la liste de fichiers et le nom de la commande. La commande est exécutée et les fichiers sont transmis comme arguments.

Dans notre exemple, la commande tail de Linux renvoie un texte de plusieurs lignes. Chaque ligne contient le nom d’un fichier à supprimer. À l’aide de 'xargs', les noms de fichier sont dissociés des lignes et transmis comme arguments à la commande rm.

  1. Pour supprimer des fichiers sous Linux, on recourt à la commande rm. Celle-ci supprime les fichiers transmis comme arguments.

Veillez à ce que les fichiers ne soient pas déplacés dans la corbeille et aussitôt supprimés.

La prudence est de rigueur quand il est question de supprimer des fichiers dans la ligne de commande Linux. Pour mettre en pratique notre exemple sans craindre pour vos données, nous vous con­seil­lons de créer au préalable un ré­per­toire avec des fichiers de test. À cette fin, exécutez le code suivant dans l’interface en ligne de commande :

mkdir ~/Bureau/tail-test/
cd ~/Bureau/tail-test/
touch test-{1..100}.bak

Pour commencer, nous créons un ré­per­toire de test nommé 'tail-test/' sur le bureau et nous accédons à ce ré­per­toire. Ensuite, nous créons 100 fichiers de test vides, 'test-1.bak' à 'test-100.bak'. Lorsque c’est fait, nous exécutons le code pour supprimer les dix fichiers les plus anciens :

ls -t ~/Bureau/tail-test/*.bak | tail | xargs rm

Sur­veil­ler les mo­di­fi­ca­tions de fichiers journaux de serveur avec la commande tail de Linux

Jusqu’ici, nous avons vu sim­ple­ment le fonc­tion­ne­ment général de la commande tail de Linux. Dans les exemples suivants, nous nous penchons sur le suivi en direct de fichiers journaux de serveur (« live tail »).

Dans ces exemples, nous imaginons qu’il s’agit d’un serveur Web Apache2 sous Ubuntu Linux. Les fichiers journaux se trouvent dans le ré­per­toire '/var/log/apache2/'. L’em­pla­ce­ment peut différer sur les autres dis­tri­bu­tions Linux. Il en va de même pour les autres serveurs Web, tels que nginx.

Note

Il se peut que seul l’uti­li­sa­teur racine ait accès au ré­per­toire contenant les fichiers journaux. Dans ce cas, il faut exécuter les commandes avec 'sudo'.

Sur­veil­ler les mo­di­fi­ca­tions d’un fichier journal de serveur avec la commande tail de Linux

Un appel normal de la commande tail affiche une fois seulement le nombre de lignes spécifié d’un fichier. Si de nouvelles données sont ajoutées à la fin du fichier par la suite, il est né­ces­saire d’exécuter à nouveau la commande. Mais il existe des options avancées pour ce cas précis. Elles per­met­tent de sur­veil­ler les mo­di­fi­ca­tions d’un fichier et de les sortir en continu.

Voyons comment cela fonc­tionne en prenant pour exemple le journal d’accès du serveur Web Apache2. Nous appelons la commande tail de Linux avec l’option -f et trans­met­tons le nom du fichier journal :

tail -f /var/log/apache2/access.log

Les mo­di­fi­ca­tions apportées au journal d’accès sont ainsi affichées en continu. Cependant, cette méthode n’est pas pratique lorsqu’il y a beaucoup d’accès par unité de temps. Dans ce cas, le journal change si ra­pi­de­ment que le terminal est inondé de données. Appuyez sur le raccourci 'Ctrl+C' pour annuler l’exécution de la live tail.

Appelée avec l’option '-f', la commande tail de Linux surveille le fichier spécifié. Si elle est supprimée, la sortie est in­ter­rom­pue. Comme expliqué plus haut, les fichiers journaux font l’objet d’un roulement pé­rio­dique. Un nouveau fichier est donc créé sous l’ancien nom. Pour continuer à suivre un fichier journal malgré le roulement, il faut employer l’option -F :

tail -F /var/log/apache2/access.log

Sur­veil­ler les mo­di­fi­ca­tions de plusieurs fichiers journaux de serveur avec la commande tail de Linux

Pour l’instant, nous avons utilisé la commande tail de Linux pour traiter seulement un fichier. Or, cette commande permet également de sur­veil­ler plusieurs fichiers en même temps. À cet effet, nous utilisons le schéma de recherche '*.log' pour suivre en continu tous les fichiers portant l’extension '.log' :

tail -F /var/log/apache2/*.log

Il existe deux autres pos­si­bi­li­tés pour traiter plusieurs fichiers. On peut d’une part utiliser l’option '-q' pour supprimer la sortie des noms de fichier :

tail -q -F /var/log/apache2/*.log

De même, l’option -v peut être utilisée pour forcer la sortie des noms de fichier. C’est judicieux si le schéma de recherche ne renvoie qu’un seul fichier :

tail -v -F /var/log/apache2/*.log

Sur­veil­ler des mo­di­fi­ca­tions par­ti­cu­lières d’un fichier journal de serveur avec la commande tail de Linux

Dans les exemples pré­cé­dents, nous avons surveillé un fichier journal en vue de suivre n’importe quelle mo­di­fi­ca­tion. En réalité, il est plus répandu de res­treindre cette fonction à certaines mo­di­fi­ca­tions. Pour limiter l’affichage des mo­di­fi­ca­tions d’un fichier journal à un schéma de recherche, il faut recourir à la commande grep. Voici un exemple général de cette méthode :

tail -F /var/log/apache2/access.log | grep <muster>

Dans les faits, il est souvent in­té­res­sant de sur­veil­ler un journal de serveur pour détecter les accès par une adresse IP par­ti­cu­lière. Cela peut s’avérer utile par exemple pour dé­ter­mi­ner si une attaque contre un serveur est terminée ou toujours en cours. Ici, nous sur­veil­lons le journal d’accès d’un serveur Web Apache con­cer­nant les requêtes provenant de l’adresse IP '93.184.216.34' :

tail -F /var/log/apache2/access.log | grep '93.184.216.34'
Note

Nous utilisons ici l’adresse IP du domaine fictif 'exemple.com'. Si un journal d’accès la contient réel­le­ment, il s’agit très cer­tai­ne­ment d’une adresse IP usurpée.

Examinons un autre cas de figure fréquent. Au lieu de filtrer le journal d’accès par adresse IP, nous sur­veil­lons les accès à une ressource spé­ci­fique. Un accès au fichier 'robots.txt' indique une requête provenant d’un robot d’in­dexa­tion de moteur de recherche. Là encore, nous avons recours à la commande grep. Avec cette commande, seuls les nouveaux accès entrants des robots sont affichés :

tail -F /var/log/apache2/access.log | grep 'robots.txt'
Aller au menu principal