Saya memiliki log server yang menampilkan baris teks tertentu ke file log-nya ketika server habis. Saya ingin menjalankan perintah setelah server menyala, dan karenanya lakukan sesuatu seperti berikut:
tail -f /path/to/serverLog | grep "server is up" ...(now, e.g., wget on server)?
Apa cara terbaik untuk melakukan ini?
text-processing
shell-script
logs
tail
jonderry
sumber
sumber
tail -F
untuk menangani rotasi log - yaitumy.log
menjadi penuh dan bergerak kemy.log.1
dan proses Anda membuat yang barumy.log
Jawaban:
Cara sederhana akan menjadi aneh.
Dan ya, keduanya adalah pesan nyata dari log kernel. Perl mungkin sedikit lebih elegan untuk digunakan untuk ini dan juga dapat menggantikan kebutuhan akan ekor. Jika menggunakan perl, akan terlihat seperti ini:
sumber
awk
solusi karena pendek dan mudah dilakukan dengan cepat dalam satu baris. Namun, jika perintah yang ingin saya jalankan memiliki tanda kutip, ini bisa sedikit rumit, apakah ada alternatif, mungkin menggunakan pipa dan perintah majemuk yang juga memungkinkan solusi satu-liner singkat tetapi tidak memerlukan perintah yang dihasilkan untuk dilewati sebagai string?system()
perintah.tail -f /path/to/serverLog | grep "server is up" | head -1 && do_some_command
tail -n 0 -f /path/to/serverLog
Itu akan membaca 0 baris terakhir file, lalu menunggu lebih banyak baris untuk dicetak.Jika Anda hanya mencari satu kemungkinan dan ingin tetap berada di shell daripada menggunakan
awk
atauperl
, Anda bisa melakukan sesuatu seperti:... yang akan berjalan
my_command
setiap kali " server habis " muncul di file log. Untuk beberapa kemungkinan, Anda mungkin dapat menjatuhkangrep
dan alih-alih menggunakancase
dalamwhile
.Modal
-F
mengatakantail
untuk menonton file log menjadi diputar; yaitu jika file saat ini diganti namanya dan file lain dengan nama yang sama menggantikannya,tail
akan beralih ke file baru.The
--line-buffered
pilihan memberitahugrep
untuk flush buffer setelah setiap baris; jika tidak,my_command
mungkin tidak dapat dijangkau secara tepat waktu (dengan asumsi log memiliki garis yang cukup besar).sumber
--line-buffered
opsi kegrep
, atau memastikan itu memerah output antara baris: jika tidak, itu hanya hang, danmy_command
tidak pernah tercapai. Jika Anda sukaack
, itu memiliki--flush
bendera; jika Anda sukaag
, coba balut denganstdbuf
. stackoverflow.com/questions/28982518/…do exit ;
. Tampaknya berfungsi dengan baik, tetapi ekor tidak pernah selesai dan skrip kami tidak pernah pindah ke baris berikutnya. Apakah ada cara untuk menghentikan ekor dido
bagian itu?Pertanyaan ini tampaknya sudah dijawab, tetapi saya pikir ada solusi yang lebih baik.
Daripada
tail | whatever
, saya pikir apa yang Anda inginkan sebenarnyaswatch
. Swatch adalah program yang dirancang secara eksplisit untuk melakukan apa yang Anda minta, menonton file log, dan mengeksekusi tindakan berdasarkan baris log. Menggunakantail|foo
akan mengharuskan Anda memiliki terminal yang aktif berjalan untuk melakukan ini. Swatch di sisi lain berjalan sebagai daemon dan akan selalu mengawasi log Anda. Swatch tersedia di semua distro Linux,Saya mendorong Anda untuk mencobanya. Meskipun Anda dapat menumbuk paku dengan sisi belakang obeng bukan berarti Anda harus melakukannya.
Tutorial 30 detik terbaik tentang carikan yang bisa saya temukan ada di sini: http://www.campin.net/newlogcheck.html
sumber
Sungguh aneh bahwa tidak ada yang menyebutkan tentang
multitail
utilitas yang memiliki fungsi ini out-of-box. Salah satu contoh penggunaan:Lihat juga contoh lain dari
multitail
penggunaan.sumber
bash bisa melakukan pekerjaan sendiri
Mari kita lihat betapa sederhananya dan mudah dibaca:
Meskipun Anda tidak menggunakan bash
regex
, ini bisa tetap sangat cepat!Tapi bash + sed adalah tandem yang sangat efisien dan menarik
Tetapi untuk server dengan beban tinggi, dan seperti yang saya suka
sed
karena sangat cepat dan sangat terukur, saya sering menggunakan ini:sumber
Begitulah cara saya mulai melakukan ini, tetapi menjadi jauh lebih canggih dengannya. Beberapa hal yang perlu diperhatikan:
Saya menggunakan sesuatu seperti ini:
Ia bekerja dengan menahan
tail
terbuka sampai${RELEASE}
file berisi data.Setelah
grep
berhasil:${RELEASE}
yang akan${wait_pid}
proses untuktail
Catatan: Ini
sed
bisa lebih canggih untuk benar-benar menentukan jumlah baris yangtail
akan diproduksi saat startup dan menghapus nomor itu. Tetapi secara umum, ini 10.sumber