Ich habe ein Serverprotokoll, das eine bestimmte Textzeile in die Protokolldatei ausgibt, wenn der Server in Betrieb ist. Ich möchte einen Befehl ausführen, sobald der Server hochgefahren ist, und daher etwa Folgendes tun:
tail -f /path/to/serverLog | grep "server is up" ...(now, e.g., wget on server)?
Wie geht das am besten?
text-processing
shell-script
logs
tail
jonderry
quelle
quelle
tail -F
die Protokollrotation zu handhaben - dh siemy.log
wird voll und wechselt zumy.log.1
und Ihr Prozess erstellt eine neuemy.log
Antworten:
Ein einfacher Weg wäre awk.
Und ja, beide sind echte Nachrichten aus einem Kernel-Log. Perl ist dafür möglicherweise etwas eleganter und kann auch die Notwendigkeit für Tail ersetzen. Wenn Sie Perl verwenden, sieht es ungefähr so aus:
quelle
awk
Lösung, kurz und einfach in einer Zeile zu arbeiten. Wenn der Befehl, den ich ausführen möchte, jedoch Anführungszeichen enthält, kann dies etwas umständlich sein. Gibt es eine Alternative, etwa die Verwendung von Pipelines und zusammengesetzten Befehlen, die auch eine kurze einzeilige Lösung ermöglicht, für die der resultierende Befehl jedoch nicht übergeben werden muss? als Zeichenfolge?system()
Befehls freigegeben.tail -f /path/to/serverLog | grep "server is up" | head -1 && do_some_command
tail -n 0 -f /path/to/serverLog
dass die letzten 0 Zeilen der Datei gelesen werden und dann darauf gewartet wird, dass weitere Zeilen gedruckt werden.Wenn Sie nur eine Möglichkeit suchen und hauptsächlich in der Shell bleiben möchten, anstatt
awk
oder zu verwendenperl
, können Sie Folgendes tun:... der
my_command
jedes Mal ausgeführt wird, wenn " Server in Betrieb " in der Protokolldatei angezeigt wird. Für mehrere Möglichkeiten könnten Sie vielleicht die fallen lassengrep
und stattdessen einecase
innerhalb der verwendenwhile
.Die Hauptstadt
-F
teilttail
mit, auf die Protokolldatei zu achten, die gedreht werden soll. dh wenn die aktuelle Datei umbenannt wird und eine andere Datei mit dem gleichen Namen ihren Platz einnimmt,tail
wird auf die neue Datei umgeschaltet.Die
--line-buffered
Option teiltgrep
mit, dass der Puffer nach jeder Zeile geleert werden soll. Andernfalls kannmy_command
möglicherweise nicht rechtzeitig erreicht werden (vorausgesetzt, die Protokolle haben eine angemessene Zeilengröße).quelle
--line-buffered
Option hinzufügengrep
oder auf andere Weise sicherstellen, dass die Ausgabe zwischen den Zeilen gespült wird. Andernfalls hängt sie nur undmy_command
wird nie erreicht. Wenn Sie es vorziehenack
, hat es eine--flush
Flagge; Wenn Sie es vorziehenag
, versuchen Sie es mitstdbuf
. stackoverflow.com/questions/28982518/…do exit ;
. Es schien gut zu funktionieren, aber der Schwanz war nie fertig und unser Drehbuch ging nie in die nächste Zeile über. Gibt es eine Möglichkeit, den Schwanz in derdo
Sektion zu stoppen ?Diese Frage scheint bereits beantwortet zu sein, aber ich denke, es gibt eine bessere Lösung.
Stattdessen
tail | whatever
denke ich, was Sie wirklich wollen, istswatch
. Swatch ist ein Programm, das speziell dafür entwickelt wurde, Ihre Anforderungen zu erfüllen, eine Protokolldatei zu überwachen und Aktionen basierend auf Protokollzeilen auszuführen. Für die Verwendung isttail|foo
es erforderlich, dass ein Terminal aktiv ist, um dies zu tun. Swatch hingegen wird als Daemon ausgeführt und überwacht immer Ihre Protokolle. Swatch ist in allen Linux-Distributionen verfügbar.Ich ermutige Sie, es auszuprobieren. Sie können zwar einen Nagel mit der Rückseite eines Schraubenziehers einschlagen, dies bedeutet jedoch nicht, dass Sie dies tun sollten.
Das beste 30-Sekunden-Tutorial zu Swatch, das ich finden konnte, finden Sie hier: http://www.campin.net/newlogcheck.html
quelle
Es ist seltsam, dass niemand etwas über
multitail
Hilfsprogramme erwähnt hat, die diese Funktionalität bereits enthalten. Ein Anwendungsbeispiel:Siehe auch weitere Beispiele von
multitail
Nutzung.quelle
Bash konnte den Job alleine machen
Lassen Sie uns sehen, wie einfach und lesbar es sein könnte:
Wenn Sie Bashs nicht verwenden
regex
, kann dies sehr schnell gehen!Aber bash + sed ist ein sehr effizientes und interessantes Tandem
Aber für Server mit hoher Auslastung, und da ich es mag,
sed
weil es sehr schnell und sehr skalierbar ist, verwende ich oft Folgendes:quelle
So habe ich auch angefangen, bin aber viel raffinierter geworden. Ein paar Dinge, mit denen man sich befassen sollte:
Ich benutze etwas in diesem Sinne:
Es funktioniert so lange,
tail
bis die${RELEASE}
Datei Daten enthält.Sobald das
grep
gelingt:${RELEASE}
den Willen${wait_pid}
Vorgang bistail
Hinweis: Sie
sed
können die Anzahl der Zeilentail
, die beim Start erzeugt werden, genauer bestimmen und diese Anzahl entfernen. Aber im Allgemeinen ist es 10.quelle