Ich habe einen CI-Server mit einer Befehlszeilenschnittstelle, mit der ich einen Auftrag remote starten kann ( jenkins
CI-Server und das jenkins-cli.jar
Tool).
Nachdem ich den Job gekickt habe habe ich tail -f
das Protokoll (sorry für den chaotischen Befehl):
ssh -t my-jenkins-host.com "tail -f \"/var/lib/jenkins/jobs/$job_name/builds/\`ls -ltr /var/lib/jenkins/jobs/$job_name/builds/ | grep '^l' | tail -n 1|awk '{print \$9}'\`/log\""
Nachdem der Auftrag erfolgreich abgeschlossen wurde, wird in der Regel nach mindestens 5 Minuten die folgende Zeile in der Ausgabe angezeigt:
Finished: SUCCESS
Gibt es eine gute Möglichkeit, das Protokoll an dieser Stelle nicht mehr zu verfolgen? dh gibt es wie ein tail_until 'some line' my-file.log
befehl?
BONUS: Zusätzliches Guthaben, wenn Sie eine Antwort liefern können, die 0 zurückgibt, wenn SUCCESS übereinstimmt, 1, wenn FAILURE übereinstimmt und Ihre Lösung auf einem Mac funktioniert! (Was ich glaube, ist BSD-basiert)
q
Befehl einen optionalen Exit-Code. Dassed
Kommando wäre alsosed '/^Finished: SUCCESS$/ q0; /^Finished: FAILURE$/ q1'
Finished: SUCCESS
es sich um die letzte Ausgabezeile handelt-q
wird beendet, sobald eine Übereinstimmung gefunden wird-x
machtgrep
die ganze Zeile passenVersuchen Sie es im zweiten Teil
-m <number>
Weist grep an, anzuhalten, nachdem die Nummer übereinstimmtund der
grep -q
Exit-Status wird nur angezeigt,0
wennSUCCESS
am Ende der Zeile gefunden wirdWenn Sie alle Ausgaben sehen möchten, können Sie sie nicht verwenden
grep -q
, aber Sie können es trotzdem tunDadurch wird alles außer dem Ausgangsstatus auf 1 gesetzt, wenn
FAILURE
angezeigt wird.quelle
grep
habe es ursprünglich in meiner Antwort verwendet, aber wenn er es verwendettail -f
, möchte er wahrscheinlich die Dateiausgabe sehen.grep
wird nicht alle ZwischenzeilenEine Variation der Antwort von @ Mikel mit den Kommentaren von @ Mrozek (Ich hätte auf den Kommentar geantwortet, aber ich glaube, ich habe noch nicht genug Rechte)
Damit können Sie die @ Mikel-Lösung verwenden und trotzdem die Ausgabe auf dem Bildschirm sehen
quelle
Ich mochte keine der Antworten hier, also beschloss ich, meine eigenen zu würfeln. Dieses Bash-Skript erfüllt alle Kriterien und enthält den BONUS für das Beenden von 1 bei einem Fehler.
Ebenfalls enthalten ist eine Timeout-Funktion, die einen Exit-Code von 3 ergibt. Wenn Sie den Timeout-Befehl nicht auf Ihrem System haben, rufen Sie das Skript timeout.sh von Anthony Thyssen auf:
http://www.ict.griffith.edu.au/anthony/software/timeout.sh
Gemäß den Kommentaren unten habe ich den Protokolldruck aktualisiert, um die Escape-Zeichenerweiterung zu stoppen, und alle Funktionen eines Standard-Lesevorgangs aufgenommen. Ausführliche Informationen zum Lesen finden Sie unter /programming//a/10929511 . Die EOF-Prüfung ist hier nicht erforderlich, aber der Vollständigkeit halber enthalten.
quelle
while IFS= read -r LOGLINE
, um zu verhindern, dass die Shell Leerzeichen in den Zeilen von aufteilttail
.read
nicht geteilt, wenn es nur eine Variable gibt (und es ist kein Array mit-a
), aber Sie müssen,-r
wenn die Eingabedaten einen Backslash enthalten. Wenn die Eingabedaten jedoch einen Backslash enthalten,echo "$var"
kann dies je nach Shell und / oder System auch zuprintf '%s\n' "$line"
Hier ist ein Python-Skript, das beinahe das macht, was ich will (siehe unten):
Vorbehalte:
Die Zeilen werden nicht gedruckt, wenn sie eingehen. Sie werden in Gruppen gedruckt
Ich müsste dies als Skript auf meinem Pfad oder so etwas installieren, so ist es unpraktisch, und ich würde einen glatten Einzeiler bevorzugen :)
quelle
tail
scheint dasselbe zu tun, also ist es wohl nicht wert, es zu versuchen, es zu umgehen.Ich hatte Probleme mit
sed
undgrep
und ihren Optionen, also schreibe ich meineone with bash conditions
quelle
Du versuchst es auch
quelle