web-dev-qa-db-fra.com

Quelle est la différence entre "tail -f" et "tail -F"?

Je n'ai jamais utilisé tail -F commande à la place toujours utilisée tail -f mais quelqu'un m'a dit que -F c'est mieux sans trop d'explication.

J'ai recherché 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 inférieur -f le fait mais je ne respecte pas les majuscules -F essaie de faire. J'apprécierais que quelqu'un puisse m'expliquer les différences.

43
DaeYoung

Vous décrivez l'utilitaire GNU tail. 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 ("tourner" signifie supprimer ou déplacer vers un autre emplacement, etc.), la sortie que je vois ne fera que Arrêtez.

Si j'ouvre le fichier avec tail comme ceci:

$ tail -F /var/log/messages

... et encore une fois, le fichier est tourné, la sortie continuerait à circuler dans ma console car tail rouvrirait le fichier dès qu'il redeviendrait disponible, c'est-à-dire lorsque le ou les programmes écrivant dans le journal a commencé à écrire dans le nouveau /var/log/messages.

Sur les systèmes BSD gratuits, il n'y a pas de -F option, mais tail -f se comportera comme tail -F fonctionne sur les systèmes GNU, à la différence près 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 CECI

Dans une session Shell, faites

$ cat >myfile

Cela vous attendra maintenant pour taper des trucs. Allez-y et tapez du charabia, quelques lignes. Tout sera enregistré dans le fichier myfile.

Dans une autre session Shell (peut-être dans un autre terminal, sans interrompre le cat):

$ tail -f myfile

Cela affichera le (fin du) contenu de myfile dans la console. Si vous revenez à la première session Shell et saisissez quelque chose de plus, cette sortie sera immédiatement affichée par tail dans la deuxième session Shell.

Maintenant, quittez cat en appuyant sur Ctrl+Det supprimez le fichier myfile:

$ rm myfile

Réexécutez ensuite le chat:

$ cat >myfile

... et tapez quelque chose, quelques lignes.

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

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

76
Kusalananda

Simplifié, lorsque vous ouvrez un fichier, vous obtiendrez l'inode qui contient des métadonnées de l'emplacement exact du fichier sur votre disque. Tail écoutera ensuite les modifications apportées à ce fichier.

Si vous supprimez le fichier et en créez un nouveau avec le même nom, le nom de fichier sera le même mais il s'agit d'un inode différent (et probablement stocké à un autre endroit sur votre disque). tail -f remplir pas réessayer et charger le nouvel inode, tail -F le détectera.

Le même effet se produira si vous renommez/déplacez un fichier. Si vous suivez par exemple /var/log/messages et logrotate fait pivoter le journal vers /var/log/messages.1. queue avec -f écoutera toujours l'ancien inode qui pointe vers messages.1. queue avec -F s'en rendra compte et lira le nouvel inode.

14
nsg