Quelle est la difference entre “tail -f” et “tail -F”?


41

Je n'ai jamais utilisé la tail -Fcommande à la place, mais toujours utilisé, tail -fmais quelqu'un m'a dit que -Fc'était mieux sans beaucoup d'explications.

J'ai regardé la page de manuel pour la commande de queue.

-f output appended data as the file grows;

-F Same as --follow=name --retry

--retry Keep trying to open a file even when it is or becomes inaccessible

Il est facile de comprendre ce qui est bas -fmais je ne suis pas ce que les majuscules -Fessaient de faire. J'apprécierais que quelqu'un puisse m'expliquer les différences.

Réponses:


74

Vous décrivez l' tailutilitaire GNU . La différence entre ces deux indicateurs est que si j'ouvre un fichier, un fichier journal par exemple, comme ceci:

$ tail -f /var/log/messages

... et si la fonction de rotation des journaux sur ma machine décide de faire pivoter ce fichier journal pendant que je regarde les messages qui y sont écrits ("faire pivoter" signifie supprimer ou déplacer vers un autre emplacement, etc.), la sortie que je vois sera simplement Arrêtez.

Si j'ouvre le fichier avec tailcomme ceci:

$ tail -F /var/log/messages

... et encore une fois, le fichier est pivoté, la sortie continue de circuler dans ma console car tailelle rouvrira le fichier dès qu’il redeviendra disponible, c’est-à-dire lorsque le ou les programmes écrivant dans le journal commenceront à écrire dans le nouveau /var/log/messages .

Sur les systèmes BSD libres, il n'y a pas d' -Foption, mais tail -fse comportera comme tail -Fles systèmes GNU, à la différence que vous obtenez le message.

tail: file has been replaced, reopening.

dans la sortie lorsque le fichier que vous surveillez disparaît et réapparaît.


VOUS POUVEZ TESTER CE

Dans une session shell, faites

$ cat >myfile

Cela va maintenant attendre que vous tapiez des choses. Allez-y, tapez du charabia, quelques lignes. Tout sera sauvegardé dans le fichier myfile.

Dans une autre session shell (peut-être dans un autre terminal, sans interrompre lecat ):

$ tail -f myfile

Cela montrera le (fin du) contenu de myfiledans la console. Si vous revenez à la première session shell et que vous tapez quelque chose de plus, cette sortie sera immédiatement affichée par tailla seconde session shell.

Maintenant, quittez caten appuyant sur Ctrl+Det supprimez le myfilefichier:

$ rm myfile

Puis relancez le chat:

$ cat >myfile

... et tapez quelque chose, quelques lignes.

Avec GNU tail, ces lignes n'apparaîtront pas dans la deuxième session du shell (où tail -fest toujours en cours d'exécution).

Répétez l'exercice avec tail -Fet observez la différence.


Oh je vois. J'ai un fichier journal système tel que foo.log, puis je vois parfois foo_06242016.log avec foo.log. Donc, je lance tail -f foo.log, il va pointer sur foo_06242016.log?
— DaeYoung

1
@DaeYoung Non, pas tout à fait. Si vous exécutez tail -f foo.loget que votre système passe foo.logà, par exemple, foo.log.0.gzla sortie que vous voyez s’arrêterait tout simplement. Si vous utilisez -Fen revanche, vous verriez le contenu de la nouvelle foo.log sans aucune pause entre les deux.
— Kusalananda

4
+1 ... merci de ne pas limiter votre réponse à la mise en œuvre de GNU, mais également d'indiquer aux gens ce à quoi on peut s'attendre dans un autre environnement.
— TOOGAM

2
Très belle illustration avec l'exemple.
— un CVn

1
@ Kusalananda: Merci pour l'exercice. J'ai observé la différence et cela m'a aidé à mieux comprendre ce que font tail -f et tail -F. ayez un jour béni!
— DaeYoung

14

Simplifié, lorsque vous ouvrez un fichier, vous obtenez un inode contenant des métadonnées indiquant exactement l'emplacement du fichier sur votre disque. Tail écoutera alors les modifications apportées à ce fichier.

Si vous supprimez le fichier et en créez un nouveau portant le même nom, le nom du fichier sera identique, mais il s'agit d'un inode différent (et probablement stocké à un emplacement différent sur votre disque). tail -ffill ne pas réessayer et charger le nouvel inode, tail -Fle détectera.

Le même effet se produira si vous renommez / déplacez un fichier. Si par exemple vous /var/log/messagessuivez et logrotate fait pivoter le journal en /var/log/messages.1. tail avec -fécoutera toujours le vieil inode qui pointe vers messages.1. tail -Fva le réaliser et lire le nouvel inode.


Merci pour votre explication. Cela a beaucoup de sens pour moi maintenant.
— DaeYoung

2
Ça va. Je comprends qu'un tel détail peut être une erreur facile à commettre. J'apprécie particulièrement le fait que votre précédente faute d'orthographe ait été corrigée et reconnue ... avec une autre faute d'orthographe. :)
— TOOGAM
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.