Saya memiliki server CI dengan antarmuka baris perintah yang memungkinkan saya untuk memulai pekerjaan dari jarak jauh ( jenkins
server CI dan jenkins-cli.jar
alatnya).
Setelah saya memulai pekerjaan saya tail -f
log (maaf untuk perintah berantakan):
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\""
Setelah pekerjaan berhasil diselesaikan, biasanya setelah setidaknya 5 menit, saya mendapatkan baris berikut pada output:
Finished: SUCCESS
Apakah ada cara yang baik untuk berhenti mengikuti log pada saat ini? yaitu apakah ada seperti tail_until 'some line' my-file.log
perintah?
BONUS: kredit ekstra jika Anda dapat memberikan jawaban yang mengembalikan 0 saat SUKSES dicocokkan, 1 saat FAILURE dicocokkan, dan solusi Anda berfungsi di mac! (yang saya percaya berdasarkan bsd)
q
perintah tersebut mengambil kode keluar opsional. Jadised
perintahnya adalahsed '/^Finished: SUCCESS$/ q0; /^Finished: FAILURE$/ q1'
Finished: SUCCESS
merupakan baris terakhir dari keluaran-q
, Yang berarti tenang, berhenti segera setelah menemukan kecocokan-x
merekgrep
mencocokkan seluruh barisUntuk bagian kedua, cobalah
-m <number>
memberitahu grep untuk berhenti setelah nomor cocokdan
grep -q
status keluar hanya akan0
jikaSUCCESS
ditemukan di akhir barisJika Anda ingin melihat semua output, Anda tidak dapat menggunakan
grep -q
, tetapi Anda masih bisa melakukannyayang melakukan segalanya kecuali mengatur status keluar ke 1 jika
FAILURE
muncul.sumber
grep
Awalnya saya menggunakan jawaban saya, tetapi jika dia menggunakantail -f
dia mungkin ingin melihat output file;grep
tidak akan menampilkan semua garis tengahVariasi pada jawaban @ Mikel dengan komentar @ Mrozek (saya akan menjawab komentar tersebut tetapi saya pikir saya belum memiliki cukup hak istimewa)
akan memungkinkan Anda untuk menggunakan solusi @ Mikel dan masih melihat output di layar
sumber
Saya tidak suka ada jawaban di sini, jadi memutuskan untuk menggulirkan jawaban saya sendiri. Skrip bash ini memenuhi semua kriteria, dan termasuk BONUS untuk keluar dari 1 pada kegagalan.
Termasuk juga adalah fitur batas waktu, yang akan menghasilkan kode keluar dari 3. Jika Anda tidak memiliki perintah batas waktu pada sistem Anda, ambil skrip timeout.sh dari Anthony Thyssen:
http://www.ict.griffith.edu.au/anthony/software/timeout.sh
Per komentar di bawah ini, saya memperbarui cetakan log untuk menghentikan ekspansi karakter dan termasuk semua fitur standar 'baca'. Lihat /programming//a/10929511 untuk rincian lengkap 'baca'. Pemeriksaan EOF tidak diperlukan di sini, tetapi sudah termasuk untuk kelengkapan.
sumber
while IFS= read -r LOGLINE
untuk mencegah shell melakukan pemisahan spasi pada garistail
.read
tidak terpecah ketika hanya ada satu variabel (dan itu bukan array dengan-a
), tetapi Anda perlu-r
jika data input berisi backslash. Tetapi jika data input mengandung backslash, makaecho "$var"
mungkin juga mengacaukan tergantung pada shell dan / atau sistem Anda, jadi lebih baikprintf '%s\n' "$line"
inilah skrip python yang hampir melakukan apa yang saya inginkan (lihat peringatan di bawah):
peringatan:
garis-garis tidak tercetak saat mereka masuk ... mereka dicetak dalam kelompok-kelompok ... sepertinya ada beberapa penyangga yang terjadi
saya harus menginstal ini sebagai skrip di jalan saya atau sesuatu, jadi itu tidak nyaman, dan saya lebih suka slick one-liner :)
sumber
tail
tampaknya melakukan buffering yang sama, jadi saya kira itu bukan sesuatu yang layak untuk dicoba.Saya punya masalah dengan
sed
dangrep
dan opsi mereka, jadi saya menulis milik sayaone with bash conditions
sumber
Anda juga mencoba
sumber