Mam serwer CI z interfejsem wiersza polecenia, który pozwala mi na zdalne rozpoczęcie zadania ( jenkins
serwer CI i jenkins-cli.jar
narzędzie).
Po wykopaniu zadania I tail -f
log (przepraszam za niechlujne polecenie):
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\""
Po pomyślnym zakończeniu zadania, zwykle po co najmniej 5 minutach, na wyjściu pojawia się następujący wiersz:
Finished: SUCCESS
Czy istnieje dobry sposób, aby w tym momencie przestać śledzić dziennik? tzn. czy jest jak tail_until 'some line' my-file.log
polecenie?
BONUS: dodatkowy kredyt, jeśli możesz podać odpowiedź, która zwraca 0, gdy SUKCES jest dopasowany, 1, gdy BŁĄD jest dopasowany, a twoje rozwiązanie działa na Macu! (który moim zdaniem jest oparty na bsd)
q
polecenie pobiera opcjonalny kod wyjścia. Tak więcsed
komenda brzmiałabysed '/^Finished: SUCCESS$/ q0; /^Finished: FAILURE$/ q1'
Finished: SUCCESS
jest to ostatni wiersz wyniku-q
, co oznacza cicho, kończy się, gdy tylko znajdzie dopasowanie-x
markigrep
dopasować cały wierszW drugiej części spróbuj
-m <number>
każe grepowi zatrzymać się po dopasowaniu numerua
grep -q
status wyjścia będzie tylko0
wtedy, gdySUCCESS
zostanie znaleziony na końcu liniiJeśli chcesz zobaczyć wszystkie dane wyjściowe, nie możesz użyć
grep -q
, ale nadal możesz to zrobićktóry robi wszystko oprócz ustawienia statusu wyjścia na 1, jeśli się
FAILURE
pojawi.źródło
grep
pierwotnie w mojej odpowiedzi, ale jeśli używatail -f
, prawdopodobnie chce zobaczyć plik wyjściowy;grep
nie pokaże wszystkich linii pośrednichOdmiana odpowiedzi @ Mikela z komentarzami @ Mrożka (odpowiedziałbym na komentarz, ale myślę, że nie mam jeszcze wystarczających uprawnień)
pozwoli ci skorzystać z rozwiązania @ Mikela i nadal wyświetla dane wyjściowe na ekranie
źródło
Nie podoba mi się żadna z odpowiedzi tutaj, więc postanowiłem rzucić własną. Ten skrypt bash spełnia wszystkie kryteria i zawiera BONUS za wyjście 1 w przypadku awarii.
Uwzględniono również funkcję limitu czasu, która spowoduje kod wyjścia 3. Jeśli nie masz w swoim systemie polecenia limitu czasu, pobierz skrypt timeout.sh z Anthony'ego Thyssena:
http://www.ict.griffith.edu.au/anthony/software/timeout.sh
Zgodnie z poniższymi komentarzami zaktualizowałem wydruk dziennika, aby zatrzymać ekspansję znaków ucieczki i zawarłem wszystkie funkcje standardowego „odczytu”. Zobacz /programming//a/10929511, aby uzyskać pełne szczegóły „czytaj”. Kontrola EOF nie jest tutaj wymagana, ale jest uwzględniona dla kompletności.
źródło
while IFS= read -r LOGLINE
aby uniemożliwić powłoce wykonywanie podziału białych znaków na liniach odtail
.read
nie dzieli się, gdy istnieje tylko jedna zmienna (i nie jest to tablica z-a
), ale potrzebujesz,-r
jeśli dane wejściowe zawierają ukośnik odwrotny. Ale jeśli dane wejściowe zawierają ukośnik odwrotny, toecho "$var"
może równieżprintf '%s\n' "$line"
Oto skrypt Pythona, który prawie robi to, co chcę (patrz zastrzeżenia poniżej):
zastrzeżenia:
wiersze nie są drukowane po ich wejściu ... są drukowane w grupach ... wydaje się, że trwa buforowanie
musiałbym zainstalować to jako skrypt na mojej ścieżce lub coś w tym stylu, więc jest to niewygodne i wolałbym zręczny jednoliniowy :)
źródło
tail
wydaje się, że robi to samo buforowanie, więc zgaduję, że nie warto tego próbować obejść.Miałem problemy z
sed
igrep
i ich możliwości, więc piszę kopalnione with bash conditions
źródło
Ty też próbujesz
źródło