Saya memiliki skrip bash yang berjalan selama mesin Linux dihidupkan. Saya memulainya seperti yang ditunjukkan di bawah ini:
( /mnt/apps/start.sh 2>&1 | tee /tmp/nginx/debug_log.log ) &
Setelah lauches, saya dapat melihat perintah tee di output ps saya seperti yang ditunjukkan di bawah ini:
$ ps | grep tee
418 root 0:02 tee /tmp/nginx/debug_log.log
3557 root 0:00 grep tee
Saya memiliki fungsi yang memantau ukuran log yang diproduksi tee dan membunuh perintah tee ketika log mencapai ukuran tertentu:
monitor_debug_log_size() {
## Monitor the file size of the debug log to make sure it does not get too big
while true; do
cecho r "CHECKING DEBUG LOG SIZE... "
debugLogSizeBytes=$(stat -c%s "/tmp/nginx/debug_log.log")
cecho r "DEBUG LOG SIZE: $debugLogSizeBytes"
if [ $((debugLogSizeBytes)) -gt 100000 ]; then
cecho r "DEBUG LOG HAS GROWN TO LARGE... "
sleep 3
#rm -rf /tmp/nginx/debug_log.log 1>/dev/null 2>/dev/null
kill -9 `pgrep -f tee`
fi
sleep 30
done
}
Yang mengejutkan saya, membunuh perintah tee juga membunuh dengan start.sh misalnya. Kenapa ini? Bagaimana saya bisa mengakhiri perintah tee tetapi start.sh saya terus berjalan? Terima kasih.
tee -a
untuktee
membuka file dalam mode append, jika tidak, tee akan melanjutkan penulisan ke dalam file pada offset yang sama setelah Anda memotongnya (dan pada sistem yang tidak mendukung file jarang seperti pada macOS yang akan realokasi bagian file yang mengarah ke posisi itu, mengambil ruang disk dua kali lebih banyak).logger -s
untuk syslog untuk mengurus logging (-s
juga mencetak pada stderr).logrotate
. Program hebatMenjelaskan "Mengapa"
Singkatnya: Jika penulisan gagal tidak menyebabkan program keluar (secara default), kami akan mengalami kekacauan. Pertimbangkan
find . | head -n 10
- Anda tidak inginfind
terus berjalan, memindai sisa hard drive Anda, setelahhead
mengambil 10 baris yang diperlukan dan melanjutkan.Melakukannya dengan Lebih Baik: Putar di Dalam Pencatat Anda
Pertimbangkan yang berikut, yang tidak digunakan
tee
sama sekali, sebagai contoh demonstratif:Jika dijalankan sebagai:
... ini akan dimulai dengan menambahkan ke
/tmp/nginx/debug_log
, mengganti nama file/tmp/nginx/debug_log.old
ketika lebih dari 100KB konten hadir. Karena logger itu sendiri sedang melakukan rotasi, tidak ada pipa yang rusak, tidak ada kesalahan, dan tidak ada jendela kehilangan data ketika rotasi terjadi - setiap baris akan ditulis ke satu file atau yang lain.Tentu saja, mengimplementasikan ini dalam bash asli tidak efisien, tetapi di atas adalah contoh ilustrasi. Ada banyak program yang tersedia yang akan menerapkan logika di atas untuk Anda. Mempertimbangkan:
svlogd
, logger layanan dari suite Runit.s6-log
, alternatif yang dikelola secara aktif dari skanet suite.multilog
dari DJB Daemontools, kakek dari keluarga alat pengawasan dan pemantauan ini.sumber