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.
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.)
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).
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.
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"`.
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.
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.
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éé.
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:
copier le fichier
cp file file2
é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
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
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.
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.
tail -F
suivra les noms de fichiers plutôt que les objets de fichier, ce qui est particulièrement utile en cas de rotation du fichier journal.tailf
est maintenant obsolète ettail -f
sécurisé. (confirmez ceci sur votre système avecman tailf
.) Voir la documentation: man7.org/linux/man-pages/man1/tailf.1.htmlVous 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:
Lance la commande
ls -l /var/adm/messages
toutes 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).la source
inotifywait
de 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:la source
path
n'est pas le meilleur choix pour un nom de variable. Surzsh
, il semble que les vars d'environnement ne sont pas sensibles à la casse. Pour moi, définir lespath
causesPATH
doit é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églagepath
n'a aucun effet surPATH
.Je préfère utiliser
less +FG
1 surtail -f
parce 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^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 en utilisant l'+
option:Pour les journaux très longs, je trouve pratique d’utiliser l’
-n
option qui désactive la numérotation des lignes. De la page de manuel:1. Coup de chapeau à rgmarcha pour l'avoir signalé dans les commentaires.
la source
alias
les options souhaitées pour ne pas avoir à les taper à chaque fois.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.
la source
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.
Enregistrez-le sous
watch.sh
et faites-lechmod 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"`
.la source
NEW=`tree -sDct . -I 'ignore_pattern|another_pattern'`
vous pouvez utiliser la commande tailf la plus simple possible
la source
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.
la source
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.
la source
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.
la source
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:
cp file file2
touch check-differences.sh
nano check-differences.sh
chmod 755 check-differences.sh
#!/bin/bash
diff file file2
cp file file2
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.
la source
Bien que
tail -f somefile.txt
je 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.la source