web-dev-qa-db-fra.com

La commande 'tail' n'obtient pas que les nouvelles lignes

J'utilise la commande:

tail -f -n 0 file.txt

Mais il continue à se répéter.


  1. Ce que je fais est le suivant:

  2. Créez le fichier dans le premier terminal: touch file.txt

  3. Commencez la queue dans le deuxième terminal: tail -f -n 0 file.txt

  4. Editez le fichier dans le premier terminal: nano file.txt

  5. Ajoutez simplement text, enregistrez et fermez. La deuxième borne affiche text comme il se doit.

  6. Editez à nouveau le fichier dans le premier terminal: nano file.txt

  7. Ajoutez à la fin (2ème ligne) more text, enregistrez et fermez. Le deuxième terminal délivre:

tail: fichier.txt: fichier tronqué
texte
plus de texte

Editez à nouveau le fichier dans le premier terminal: nano file.txt

Ajoutez à la fin (3ème ligne) even more text, sauvegardez et fermez. Le second terminal affiche even more text comme il se doit.

Editez à nouveau le fichier dans le premier terminal: nano file.txt

Ajoutez à la fin (4ème ligne) and even more text, sauvegardez et fermez. Le deuxième terminal délivre:

tail: file.txt: file truncated
text
more text
even more text
and even more text

J'ai besoin de la commande pour ne pas se répéter.

La sortie a abouti à:

tail -f -n 0 file.txt
text
tail: file.txt: file truncated
text
more text
even more text
tail: file.txt: file truncated
text
more text
even more text
and even more text

Et j'en ai besoin pour sortir:

tail -f -n 0 file.txt
text
more text
even more text
and even more text

Ou, s'il n'est pas possible de supprimer le message "fichier tronqué", quelque chose comme:

tail -f -n 0 file.txt
text
tail: file.txt: file truncated
more text
even more text
tail: file.txt: file truncated
and even more text

Je ne sais pas non plus pourquoi cela donne un message tronqué au fichier. Je commence à insérer le nouveau texte à la fin du fichier.

4
Edu

D'abord, vous obtenez l'erreur parce que vous utilisez un éditeur de texte pour cela. Cela signifie que chaque fois que vous ouvrez, modifiez et enregistrez le fichier, l’original est remplacé par le nouveau contenu. Que vous ayez ajouté une seule ligne à la fin ou 100 lignes partout est sans importance, le fait est que le fichier est en train d'être ouvert, modifié et enregistré et que le contenu est écrasé.

Par exemple, comparez votre flux de travail pour exécuter ceci:

for((i=0;i<20;i++)); do echo $i >> file.txt; sleep 1; done

Cela écrira un numéro dans file.txt toutes les secondes pendant vingt secondes. Si vous ouvrez un autre terminal et exécutez tail -fn 0 file.txt, vous verrez le résultat attendu.

Donc, pour obtenir le comportement souhaité, ajoutez le texte au fichier en utilisant >> depuis un terminal au lieu de le modifier manuellement.


Plus de détails

nano semble être l'intrus ici. La plupart des éditeurs lors de l'ouverture d'un fichier puis de son enregistrement suppriment le fichier d'origine et en enregistrent un nouveau du même nom. Vous pouvez le tester en vérifiant le numéro d'inode du fichier:

$ ls -il file.txt
16647801 -rw-r--r-- 1 terdon terdon 9 Apr  6 18:19 file.txt

Les fichiers sont simplement des liens durs vers des inodes spécifiques. Dans ce cas, file.txt pointe sur inode 16647801. Maintenant, ouvrez le fichier dans gedit, ajoutez une ligne et vérifiez à nouveau l'inode:

$ gedit file.txt
$ ls -il file.txt
16647854 -rw-r--r-- 1 terdon terdon 13 Apr  6 18:23 file.txt

Comme vous le voyez, le numéro d'inode a changé. En d'autres termes, le fichier d'origine a été supprimé et un nouveau créé. nano ne fait pas cela, essayer la même chose avec nano ne modifie pas l'inode. Cependant, il supprime le contenu d'origine en le remplaçant par le nouveau. C’est pourquoi tail affiche le résultat. Si vous l’essayez et modifiez le fichier avec gedit (ou emacs ou plusieurs autres éditeurs), les lignes supplémentaires que vous ajoutez ne seront pas indiqué dans la sortie de tail du tout.

13
terdon

Comme indiqué dans l'une des autres réponses, cela se produit car votre fichier est écrasé chaque fois que vous enregistrez le fichier. La commande tail a été conçue pour surveiller les fichiers journaux dans lesquels de nouvelles lignes sont ajoutées au fichier.

Dans cette situation particulière, j'utiliserais les solutions suivantes comme solution de contournement:

watch -n 1 cat file.txt

La commande watch exécute une commande périodiquement. L'intervalle de mise à jour, en secondes, est spécifié avec -n et peut être ajusté à votre guise.

7
nullmem