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.

DaeYoung
la source

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.

Kusalananda
la source
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.

NS g
la source
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