Ketika melakukan a tail -f error.log
, bagaimana cara memasukkan terputus secara terprogram setelah tidak ada yang ditambahkan ke file selama 3 detik?
(tentu saja, setelah satu jeda baris ditambahkan, tidak ada jeda baris lain yang harus ditambahkan sampai baris teks ditambahkan ke file log)
Misalnya, baris-baris ini ditambahkan ke error.log:
foo
bar
boo [[wait 4 seconds]]
2far
2foo
2bar
2boo [[wait 40 seconds]]
2far
Ini akan menjadi output di konsol:
foo
bar
boo
2far
2foo
2bar
2boo
2far
shell-script
text-processing
tail
Cedric
sumber
sumber
ts
untuk menambahkan timestamping ke output dan memproses cap waktuJawaban:
Anda selalu dapat mengimplementasikan
tail -f
(yah di sini, kecuali Anda menghapus tanda komentarseek()
, lebih sepertitail -n +1 -f
saat kita membuang seluruh file) dengan tanganperl
misalnya:Atau biarkan
tail -f
tailing dan gunakanperl
untuk memasukkan baris baru jika tidak ada input selama 3 detik:Mereka menganggap bahwa output itu sendiri tidak melambat (seperti ketika output pergi ke pipa yang tidak aktif dibaca).
sumber
bash
+date
solusi:sumber
$SECONDS
untuk menghitung interval waktu. Saya pikir ini adalah jumlah detik sejak shell dimulai, bukan itu penting ketika mengambil perbedaan.read -t
atau$TMOUT
.$SECONDS
rusakbash
danmksh
.time bash -c 'while ((SECONDS < 3)); do :; done'
akan bertahan antara 2 dan 3 detik. Lebih baik menggunakan zsh atau ksh93 sebagai gantinya di sini (dengantypeset -F SECONDS
)date +%s
. Keduanya memberikan waktu dalam detik penuh, yang memang memiliki efek bahwa interval dari, katakanlah, 1.9 hingga 4.0 terlihat seperti 3 detik penuh, meskipun itu benar-benar 2.1. Sulit untuk menyelesaikannya jika Anda tidak dapat mengakses detik pecahan. Tapi ya, mereka mungkin sebaiknya tidur di sini alih-alih sibuk, dan kemudianread -t
bisa digunakan. Bahkan jika Anda tidur secara manual, tetaptime bash -c 'while [[ $SECONDS -lt 3 ]]; do sleep 1; done'
bekerja dengan baik.SECONDS=0
memastikan bahwa$SECONDS
akan mencapai 1 tepat 1 detik. Itu tidak terjadi denganbash
seperti yang digunakantime()
untuk melacak,$SECONDS
bukangettimeofday()
. Saya melaporkan bug ke mksh, zsh dan bash beberapa waktu lalu, hanya zsh yang diperbaiki. (Poin bagus tentang masalah ini sama dengandate +%s
). Perhatikan bahwa ini bukan kesibukan di sini, karena kita membaca dari hasiltail -f
lebih dari satu pipa.printf
untuk menirudate
tanpa alat eksternal atau substitusi perintah:printf -v t '%(%s)T' -1
.Python
solusi (dengan argumen kesenjangan waktu dinamis ):tailing_by_time.py
naskah:Pemakaian:
sumber