web-dev-qa-db-fra.com

Commande shell pour surveiller les modifications dans un fichier

Je sais qu'il y avait une commande sur Unix que je pouvais utiliser pour surveiller un fichier et voir les modifications qui y étaient écrites. Cela a été très utile, en particulier pour vérifier les fichiers journaux.

Savez-vous comment ça s'appelle?

167
Sebastian Hoitz

Tu veux dire

tail -f logfile.log

?

( page de manuel pour la queue )

220
Jon Skeet

Vous vouliez probablement parler de queue, selon la réponse de Jon Skeet.

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

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

Exécutera la commande ls -l /var/adm/messages toutes les 10 secondes et mettez en évidence la différence de sortie entre les exécutions suivantes. (Utile pour observer la vitesse de croissance d'un fichier journal, par exemple).

128
Murali Suriar

inotifywait from inotify-tools est utile si vous souhaitez exécuter une commande chaque fois qu'un fichier (ou n'importe quel fichier d'un répertoire) change. Par exemple:

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

Je préfère utiliser less +FG1 plus de tail -f car je dois rechercher dans un fichier journal une erreur ou un ID spécifique. Si je dois rechercher quelque chose, je tape ^C pour 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 à l'aide de + 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 le -n option qui désactive la numérotation des lignes. Depuis 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. Pointe du chapeau à rgmarcha pour l'avoir signalé dans les commentaires.

37
Jon Ericson

Tail is great ... moins peut aussi être utilisé commencer moins sur le fichier c'est-à-dire moins mon fichier puis appuyer sur Shift+F. Cela a moins de fonction de queue.

21
trent

J'édite un fichier LaTeX et je voulais également le surveiller pour les changements quelque part au milieu. J'ai fouetté le petit script Shell suivant qui m'a été utile. J'espère que cela sera également 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.sh et fait chmod u+x watch.sh. Ensuite, je l'exécute comme suit:

./watch.sh file.tex pdflatex

Si vous souhaitez que la commande ne soit exécutée qu'en cas de modification réelle, vous pouvez utiliser `md5sum "$FILE"` au lieu de `ls -l "$FILE"`.

16
oliphaunt

vous pouvez utiliser la commande tailf la plus simple

tailf logfile.log
8
reegan vijay

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

Mais si vous voulez simplement ajouter des lignes à la sortie, je suis d'accord sur la queue.

6
Martin

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

3
hlovdal

Si je veux pouvoir rechercher autour du fichier en plus de le suivre, 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 survolé ou remplacé par edit (mode par défaut pour vim's: w).

tail -f obligera tail à stocker le descripteur de fichier et à le suivre. 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 queue 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 suivre un fichier journal mais que le fichier n'a pas encore été créé.

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

3
deinspanjer

Oubliez tailf, diff est la commande que vous souhaitez. Voici une bonne astuce pour observer les différences lorsqu'elles se produisent en temps réel (ou se ferment) entre 2 fichiers ou dans un fichier en cours d'écriture.

Vous pouvez utiliser ces méthodes pour modifier le comportement comme vous le souhaitez, par exemple en écrivant 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 surveiller les modifications qui y sont apportées:

Voici donc quoi faire:

  1. copier le fichier

    cp file file2
    
  2. écrire un script bash pour trouver les différences et mettre à jour le fichier2

    touch check-differences.sh
    nano check-differences.sh
    chmod 755 check-differences.sh
    
  3. Voici une idée de base pour le script. Faites-le écrire dans un fichier si vous le souhaitez

    #!/bin/bash
    diff file file2
    cp file file2
    
  4. Ensuite, vous pouvez soit regarder les différences à l'écran en utilisant la montre

    watch ./check-differences
    

cela se mettra à jour toutes les 2 secondes par défaut. Donc, si vous devez revenir en arrière et les lire, écrivez ensuite 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.

2
Mezmer

Tandis que tail -f somefile.txt continue de défiler avec de nouvelles données, je parfois préfère less +G somefile.txt aussi pour regarder un patch des dernières données dans le fichier.

1
phantomastray