77 votes

Surveillance d'un fichier jusqu'à ce qu'une chaîne soit trouvée

J'utilise tail -f pour surveiller un fichier journal dans lequel on écrit activement. Lorsqu'une certaine chaîne est écrite dans le fichier journal, je veux arrêter la surveillance et continuer avec le reste de mon script.

Actuellement, j'utilise :

tail -f logfile.log | grep -m 1 "Server Started"

Lorsque la chaîne est trouvée, grep s'arrête comme prévu, mais je dois trouver un moyen de faire en sorte que les tail quitter aussi pour que le script puisse continuer.

6voto

bluesmoon Points 1983

Après avoir fait quelques tests, j'ai trouvé un moyen rapide, en une ligne, pour que cela fonctionne. Il semble que tail -f s'arrête lorsque grep s'arrête, mais il y a un problème. Il semble qu'il ne soit déclenché que si le fichier est ouvert et fermé. J'ai réalisé cela en ajoutant la chaîne vide au fichier lorsque grep trouve la correspondance.

tail -f logfile |grep -m 1 "Server Started" | xargs echo "" >> logfile \;

Je ne suis pas sûr de la raison pour laquelle l'ouverture/la fermeture du fichier déclenche la réalisation par tail que le tuyau est fermé, donc je ne compterais pas sur ce comportement. mais cela semble fonctionner pour le moment.

Raison pour laquelle il se ferme, regardez le drapeau -F, par rapport au drapeau -f.

4voto

bmike Points 2991

Ce sera un peu délicat car vous devrez entrer dans le contrôle du processus et la signalisation. Une solution plus compliquée serait une solution à deux script utilisant le suivi PID. Une meilleure solution serait d'utiliser des tuyaux nommés comme ça.

Quel Shell Shell utilisez-vous ?

Pour une solution rapide et sale, un script - je ferais un script perl en utilisant Fichier:Queue

use File::Tail;
$file=File::Tail->new(name=>$name, maxinterval=>300, adjustafter=>7);
while (defined($line=$file->read)) {
    last if $line =~ /Server started/;
}

Ainsi, plutôt que d'imprimer à l'intérieur de la boucle while, vous pourriez filtrer la correspondance de la chaîne et sortir de la boucle while pour laisser votre script continuer.

Dans les deux cas, il suffit d'un petit apprentissage pour mettre en œuvre le contrôle du flux de surveillance que vous recherchez.

3voto

Seva Alekseyev Points 231

Les lire tous. tldr : découpler la terminaison de tail de grep.

Les deux formes les plus pratiques sont

( tail -f logfile.log & ) | grep -q "Server Started"

et si vous avez bash

grep -m 1 "Server Started" <(tail -f logfile.log)

Mais si cette queue qui reste en arrière-plan vous dérange, il y a un moyen plus agréable qu'un fifo ou toute autre réponse ici. Nécessite bash.

coproc grep -m 1 "Server Started"
tail -F /tmp/x --pid $COPROC_PID >&${COPROC[1]}

Ou si ce n'est pas tail qui sort des choses,

coproc command that outputs
grep -m 1 "Server Started" <&${COPROC[0]}
kill $COPROC_PID

En bash, vous pouvez également vous débarrasser de la sortie de contrôle du travail en l'entourant de () :

(coproc command that outputs; grep -m 1 "Server Started" ${COPROC[0]}; kill $COPROC_PID)

2voto

Mike Points 153

Attendre que le fichier apparaisse

while [ ! -f /path/to/the.file ] 
do sleep 2; done

attendre que la chaîne de caractères s'affiche dans le fichier

while ! grep "the line you're searching for" /path/to/the.file  
do sleep 10; done

https://superuser.com/a/743693/129669

2voto

Je ne peux pas imaginer une solution plus propre que celle-ci :

#!/usr/bin/env bash
# file : untail.sh
# usage: untail.sh logfile.log "Server Started"
(echo $BASHPID; tail -f $1) | while read LINE ; do
    if [ -z $TPID ]; then
        TPID=$LINE # the first line is used to store the previous subshell PID
    else
        echo "$LINE"; [[ "$LINE" == *"${*:2}"* ]] && kill -3 $TPID && break
    fi
done

ok, peut-être que le nom peut être sujet à des améliorations...

Avantages :

  • il n'utilise pas d'utilitaires spéciaux
  • il n'écrit pas sur le disque
  • il quitte gracieusement la queue et ferme le tuyau
  • il est assez court et facile à comprendre

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X