J'ai un journal de serveur qui affiche une ligne de texte spécifique dans son fichier journal lorsque le serveur est opérationnel. Je veux exécuter une commande une fois que le serveur est en marche, et par conséquent, procédez comme suit:
tail -f /path/to/serverLog | grep "server is up" ...(now, e.g., wget on server)?
Quelle est la meilleure façon de procéder?
text-processing
shell-script
logs
tail
Jonderry
la source
la source
tail -F
pour gérer la rotation des journaux - c'est-à-dire qu'ellemy.log
devient pleine etmy.log.1
que le processus en crée un nouveaumy.log
Réponses:
Un moyen simple serait génial.
Et oui, les deux sont de vrais messages d'un journal de noyau. Perl pourrait être un peu plus élégant à utiliser pour cela et peut également remplacer le besoin de queue. Si vous utilisez perl, cela ressemblera à ceci:
la source
awk
solution pour être courte et facile à faire à la volée en une seule ligne. Cependant, si la commande que je veux exécuter a des guillemets, cela peut être un peu fastidieux. Existe-t-il une alternative, peut-être utiliser des pipelines et des commandes composées qui permet également une solution brève à une ligne sans que la commande résultante soit transmise comme une chaîne?system()
commande.tail -f /path/to/serverLog | grep "server is up" | head -1 && do_some_command
tail -n 0 -f /path/to/serverLog
celle qui lira les 0 dernières lignes du fichier, puis attendra que plus de lignes soient imprimées.Si vous recherchez seulement une possibilité et souhaitez rester principalement dans la coquille plutôt que d'utiliser
awk
ouperl
, vous pouvez faire quelque chose comme:... qui s'exécutera à
my_command
chaque fois que "le serveur est en service " apparaît dans le fichier journal. Pour de multiples possibilités, vous pouvez peut-être laisser tomber legrep
et utiliser plutôt uncase
dans lewhile
.La capitale
-F
indiquetail
de surveiller le fichier journal à faire pivoter; Par exemple, si le fichier en cours est renommé et qu'un autre fichier portant le même nom prend sa place,tail
il basculera vers le nouveau fichier.L'
--line-buffered
option indiquegrep
de vider son tampon après chaque ligne; sinon, ilmy_command
peut ne pas être atteint à temps (en supposant que les journaux contiennent des lignes de taille raisonnable).la source
--line-buffered
option àgrep
, ou sinon vous assurer qu'elle purge sa sortie entre les lignes: sinon, elle se bloque etmy_command
n'est jamais atteinte. Si vous préférezack
, il y a un--flush
drapeau; si vous préférezag
, essayez d'envelopper avecstdbuf
. stackoverflow.com/questions/28982518/…do exit ;
. Cela semblait bien fonctionner, mais la queue ne finissait jamais et notre script ne passait jamais à la ligne suivante. Est-il possible d'arrêter la queue dans lado
section?On semble déjà avoir répondu à cette question, mais je pense qu'il existe une meilleure solution.
Plutôt que
tail | whatever
, je pense que ce que vous voulez vraiment, c'estswatch
. Swatch est un programme conçu explicitement pour faire ce que vous demandez, regarder un fichier journal et exécuter des actions en fonction des lignes de journal. Pour utilisertail|foo
cette fonction, vous devez disposer d’un terminal actif. Swatch, de son côté, fonctionne comme un démon et surveillera toujours vos journaux. Swatch est disponible dans toutes les distributions Linux,Je vous encourage à l'essayer. Bien que vous puissiez enfoncer un clou dans le dos d’un tournevis, cela ne signifie pas que vous devriez le faire.
Le meilleur tutoriel de 30 secondes sur swatch que j'ai pu trouver est ici: http://www.campin.net/newlogcheck.html
la source
Il est étrange que personne ne mentionne un
multitail
utilitaire doté de cette fonctionnalité immédiatement. Un exemple d'utilisation:Voir aussi un autre exemple d'
multitail
utilisation.la source
bash pourrait faire le travail tout seul
Voyons à quel point cela pourrait être simple et lisible:
Bien que vous n'utilisiez pas bash
regex
, cela pourrait rester très rapide!Mais bash + sed est un tandem très efficace et intéressant
Mais pour les serveurs à forte charge, et comme je l’aime bien
sed
parce que c’est très rapide et très évolutif, j’utilise souvent ceci:la source
C'est comme ça que j'ai commencé à faire ça aussi mais que je suis devenu beaucoup plus sophistiqué avec ça. Quelques choses à se préoccuper de:
J'utilise quelque chose dans le sens de ceci:
Cela fonctionne en maintenant
tail
ouvert jusqu'à ce que le${RELEASE}
fichier contienne des données.Une fois le
grep
réussit:${RELEASE}
laquelle${wait_pid}
processus pourtail
Remarque: Il
sed
peut être plus sophistiqué de déterminer le nombre de lignestail
générées au démarrage et de supprimer ce nombre. Mais généralement, il est 10.la source