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.

2voto

frakman1 Points 115

Vous n'avez pas besoin de queue pour le faire. Je pense que le regarder est ce que vous recherchez. La commande watch surveille la sortie d'un fichier et peut être interrompue par la commande -g lorsque la sortie a changé.

watch -g grep -m 1 "Server Started" logfile.log && Yournextaction

1voto

Nki Yanchev Points 23

Alex, je pense que celui-ci va beaucoup t'aider.

tail -f logfile |grep -m 1 "Server Started" | xargs echo "" >> /dev/null ;

cette commande ne donnera jamais d'entrée dans le fichier journal mais grepera silencieusement...

1voto

Pete Points 170

Voici une bien meilleure solution qui ne vous oblige pas à écrire dans le fichier journal, ce qui est très dangereux, voire impossible dans certains cas.

sh -c 'tail -n +0 -f /tmp/foo | { sed "/EOF/ q" && kill $$ ;}'

Actuellement, il n'a qu'un seul effet secondaire, le tail restera en arrière-plan jusqu'à ce que la ligne suivante soit écrite dans le journal.

1voto

user503391 Points 11

Les autres solutions proposées ici présentent plusieurs problèmes :

  • si le processus de journalisation est déjà en panne ou s'arrête pendant la boucle, il fonctionnera indéfiniment.
  • modification d'un journal qui ne doit être que consulté
  • écrire inutilement un fichier supplémentaire
  • ne permettant pas une logique supplémentaire

Voici ce que j'ai trouvé en utilisant tomcat comme exemple (enlevez les hachages si vous voulez voir le journal pendant le démarrage) :

function startTomcat {
    loggingProcessStartCommand="${CATALINA_HOME}/bin/startup.sh"
    loggingProcessOwner="root"
    loggingProcessCommandLinePattern="${JAVA_HOME}"
    logSearchString="org.apache.catalina.startup.Catalina.start Server startup"
    logFile="${CATALINA_BASE}/log/catalina.out"

    lineNumber="$(( $(wc -l "${logFile}" | awk '{print $1}') + 1 ))"
    ${loggingProcessStartCommand}
    while [[ -z "$(sed -n "${lineNumber}p" "${logFile}" | grep "${logSearchString}")" ]]; do
        [[ -z "$(ps -ef | grep "^${loggingProcessOwner} .* ${loggingProcessCommandLinePattern}" | grep -v grep)" ]] && { echo "[ERROR] Tomcat failed to start"; return 1; }
        [[ $(wc -l "${logFile}" | awk '{print $1}') -lt ${lineNumber} ]] && continue
        #sed -n "${lineNumber}p" "${logFile}"
        let lineNumber++
    done
    #sed -n "${lineNumber}p" "${logFile}"
    echo "[INFO] Tomcat has started"
}

1voto

phio Points 11

El tail peut être mise en arrière-plan et son pid envoyé en écho à la commande grep sous-coque. Dans le grep sous-shell, un gestionnaire de piège sur EXIT peut tuer la tail commandement.

( (sleep 1; exec tail -f logfile.log) & echo $! ; wait ) | 
     (trap 'kill "$pid"' EXIT; pid="$(head -1)"; grep -m 1 "Server Started")

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