Commande Shell pour surveiller les modifications dans un fichier - Comment s'appelle-t-elle à nouveau?


160

Je sais que je pouvais utiliser une commande sous Unix pour surveiller un fichier et voir les modifications qui y étaient écrites. Cela était particulièrement utile pour vérifier les fichiers journaux.

Savez-vous comment il s'appelle?

Réponses:


214

Tu veux dire

tail -f logfile.log

?

( Page de manuel pour la queue )


6
Oui, c'est le temps réel.
Adam Gibbins

18
Note: Si votre distribution fournit la commande tailf, utilisez-la de préférence à tail -f. tailf est plus efficace car il n'a pas besoin d'accéder au fichier surveillé s'il n'est pas écrit (les accès au sondage sont gênants si vous avez monté le système de fichiers avec la mise à jour atime.)
Mihai Limbăşan

10
Au super utilisateur, j'ai trouvé une réponse recommandant tail -F au lieu de -f aussi
Rafa

17
tail -Fsuivra les noms de fichiers plutôt que les objets de fichier, ce qui est particulièrement utile en cas de rotation du fichier journal.
Amir Ali Akbari

2
Mise à jour, quelques années plus tard: tailfest maintenant obsolète et tail -fsécurisé. (confirmez ceci sur votre système avec man tailf.) Voir la documentation: man7.org/linux/man-pages/man1/tailf.1.html
exp1orer

124

Vous avez probablement voulu dire queue, selon la réponse de Jon Skeet

Un autre utile est regarder ; cela vous permet d'exécuter une commande périodiquement et de voir la sortie en plein écran. Par exemple:

regarder -n 10 -d ls -l / var / adm / messages

Lance la commande ls -l /var/adm/messagestoutes les 10 secondes et met en évidence la différence de sortie entre les exécutions suivantes. (Utile pour regarder à quelle vitesse un fichier journal grandit, par exemple).


38

inotifywaitde inotify-tools est utile si vous souhaitez exécuter une commande chaque fois qu'un fichier (ou un fichier dans un répertoire) change. Par exemple:

inotifywait -r -m -e modify /var/log | 
   while read path _ file; do 
       echo $path$file modified
   done

Juste une note qui pathn'est pas le meilleur choix pour un nom de variable. Sur zsh, il semble que les vars d'environnement ne sont pas sensibles à la casse. Pour moi, définir les pathcauses PATHdoit également l'être, ce qui signifie que rien ne sera exécuté tant que vous n'avez pas résolu le problème. Activé bash, le réglage pathn'a aucun effet sur PATH.
Thanatos le

36

Je préfère utiliser less +FG1 sur tail -fparce que je trouve moi - même besoin de rechercher un fichier journal pour une erreur spécifique ou ID. Si je dois rechercher quelque chose, je tape ^Cpour arrêter de suivre le fichier et ?pour commencer la recherche en arrière.

Les raccourcis clavier sont à peu près les mêmes que dans vi. Toute commande peut être initialisée au démarrage en utilisant l' +option:

+cmd   Causes  the  specified  cmd  to be executed each time a new file is
       examined.  For example, +G causes less to  initially  display  each
       file starting at the end rather than the beginning.

Pour les journaux très longs, je trouve pratique d’utiliser l’ -noption qui désactive la numérotation des lignes. De la page de manuel:

-n or --line-numbers
          Suppresses line numbers.  The default (to use line numbers)  may
          cause  less  to run more slowly in some cases, especially with a
          very large input file.  Suppressing line  numbers  with  the  -n
          option  will  avoid this problem.  Using line numbers means: the
          line number will be displayed in the verbose prompt and in the =
          command,  and the v command will pass the current line number to
          the editor (see also  the  discussion  of  LESSEDIT  in  PROMPTS
          below).

1. Coup de chapeau à rgmarcha pour l'avoir signalé dans les commentaires.


N'oubliez pas de définir aliasles options souhaitées pour ne pas avoir à les taper à chaque fois.
Michael Hampton

En fait, vous devriez généralement préférer les fonctions du shell aux alias dans la plupart des cas.
triplee

21

Tail is great ... moins peut également être utilisé, commencez moins sur le fichier, c’est-à-dire moins mon fichier, puis appuyez sur Shift+ F. Cela a moins agir comme une queue.


5
moins + F myfile le fera aussi
rgmarcha

16

J'édite un fichier LaTeX et je souhaite également surveiller les modifications quelque part au milieu. J'ai préparé le petit script suivant qui m'a été utile. J'espère que ça va aussi être utile à quelqu'un d'autre.

#!/bin/bash
FILE="$1"
CMD="$2"
LAST=`ls -l "$FILE"`
while true; do
  sleep 1
  NEW=`ls -l "$FILE"`
  if [ "$NEW" != "$LAST" ]; then
    "$CMD" "$FILE"
    LAST="$NEW"
  fi
done

Enregistrez-le sous watch.shet faites-le chmod u+x watch.sh. Puis je l'exécute comme suit:

./watch.sh file.tex pdflatex

Si vous souhaitez que la commande ne soit exécutée que si la modification a effectivement lieu, vous pouvez utiliser à la `md5sum "$FILE"`place de `ls -l "$FILE"`.


1
pour regarder les répertoires et leur contenu au lieu d'un seul fichier:NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
Andy


6

Vous pouvez également utiliser inotifywatch / inotifywait qui se connecte au sous-système de noyaux inotify. De cette façon, vous pouvez également surveiller des éléments tels que "ouvrir", "fermer" ou "accès".

Mais si vous voulez simplement obtenir des lignes ajoutées à stdout, je suis d'accord sur la queue.


3

Tail est l'outil standard, traditionnel, disponible partout dans Unix. Le multitail est un outil un peu plus sophistiqué qui peut surveiller plusieurs fichiers simultanément et met en évidence la syntaxe.


3

Si je veux être capable de chercher dans le fichier en plus de le mettre au bout, j'utilise moins avec la commande "F".

Lorsque vous utilisez tail, gardez à l'esprit que des arguments supplémentaires sont nécessaires si le fichier peut être remplacé ou remplacé par edit (mode par défaut pour vim: w).

tail -f fera en sorte que tail stocke le descripteur de fichier et le suive. Si le fichier est remplacé, le descripteur sera modifié. L'avantage de suivre le descripteur de fichier est que si le fichier est renommé, vous le suivrez toujours.

tail --follow = fera suivre le fichier nommé en le rouvrant périodiquement pour voir s'il a été remplacé.

--retry est une autre option utile si vous souhaitez modifier un fichier journal mais que le fichier n'a pas encore été créé.

tail -F est un raccourci pour --follow = --retry.


2

Oubliez tailf, diff est la commande que vous voulez. Voici un bon truc pour observer les différences telles qu'elles se produisent en temps réel (ou proches) entre 2 fichiers ou dans un fichier en cours d'écriture.

Vous pouvez utiliser ces méthodes pour modifier le comportement de n'importe quelle manière, par exemple écrire les modifications dans un fichier à conserver. Jouez avec l'intervalle de veille ou d'autres options pour les commandes ci-dessous.

Vous avez 1 fichier et vous souhaitez voir les modifications apportées:

Alors voici ce qu'il faut faire:

  1. copier le fichier

cp file file2

  1. écrire un script bash pour trouver les différences et mettre à jour fichier2

touch check-differences.sh

nano check-differences.sh

chmod 755 check-differences.sh

  1. Voici une idée de base pour le script. Faites-le écrire dans un fichier si vous voulez

#!/bin/bash

diff file file2

cp file file2

  1. Ensuite, vous pouvez soit regarder les différences à l’écran en utilisant watch

watch ./check-differences

cela mettra à jour toutes les 2 secondes par défaut. Donc, si vous avez besoin de revenir en arrière et de les lire, écrivez la sortie de diff dans un fichier du script.

ou utilisez cron pour exécuter votre script régulièrement si vous n'avez pas besoin de voir la sortie.


1

Bien que tail -f somefile.txtje continue à faire défiler de nouvelles données, je préfère parfoisless +G somefile.txt aussi regarder un patch contenant les dernières données du fichier.


4
Je pense que tout cela est couvert dans cette réponse d'il y a 7 ans.
Kasperd
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.