Bagaimana saya bisa membatasi ukuran file log yang ditulis dengan >>
200MB?
$ run_program >> myprogram.log
io-redirection
limit
size
David
sumber
sumber
Jawaban:
Jika aplikasi Anda (mis.
run_program
) Tidak mendukung pembatasan ukuran file log, maka Anda dapat memeriksa ukuran file secara berkala dalam satu lingkaran dengan aplikasi atau skrip eksternal.Anda juga dapat menggunakan
logrotate(8)
untuk memutar log Anda, ia memilikisize
parameter yang dapat Anda gunakan untuk tujuan Anda:sumber
postscript
opsi untuk mengirim konfigurasi logrotateSIGHUP
ke program.Jika program Anda tidak perlu menulis file LAINNYA yang akan lebih besar dari batas ini, Anda dapat menginformasikan kernel menggunakan batas ini
ulimit
. Sebelum Anda menjalankan perintah Anda, jalankan ini untuk menyiapkan batas ukuran file 200MB untuk semua proses yang dijalankan di sesi shell Anda saat ini:Ini akan melindungi sistem Anda, tetapi mungkin jaring untuk program yang menulis file. Seperti yang disarankan eyazici , pertimbangkan untuk mengatur
logrotate
untuk memangkas file log setelah mereka mencapai ukuran atau usia tertentu. Anda dapat membuang data lama atau mengarsipkannya untuk jangka waktu tertentu dalam serangkaian file terkompresi.sumber
Anda dapat membuat image sistem file baru, pasang menggunakan perangkat loop dan letakkan file log pada sistem file itu:
Anda juga dapat menggunakan
tmpfs
sebagai ganti file, jika Anda memiliki cukup memori.sumber
Anda dapat memotong output dengan
head
:sumber
SIGPIPE
) setelah telah mencapai batas ukuran, daripada membuang data.dd
sihir tapi ya @ Random832 benar, Anda akan mendapatkanSIGPIPE
sebagaihead
/dd
/whatever
menjatuhkannya.trap '' SIGPIPE
?{ head -c "$size" >> log; cat > /dev/null; }
.Dalam paket
apache2-utils
disebut utilitas saat inirotatelogs
, mungkin bermanfaat bagi Anda.Ringkasan:
rotatelogs [-l] [-L linkname ] [-p program ] [-f] [-t] [-v] [-e] [-c] [-n jumlah-of-file ] logfile waktu rotasi | filesize (B | K | M | G) [ offset ]
Contoh:
Manual lengkap bisa Anda baca di tautan ini .
sumber
Saya yakin poster asli telah menemukan solusi. Berikut ini satu lagi untuk orang lain yang dapat membaca utas ini ...
Curtail membatasi ukuran output program dan mempertahankan 200MB output terakhir dengan perintah berikut:
Referensi
CATATAN: Saya adalah pengelola repo di atas. Hanya berbagi solusinya ...
sumber
Karena ini adalah teks, saya akan menulis skrip dalam bahasa favorit Anda dan mengirimkannya ke situ. Apakah itu menangani file I / O (atau menyimpan semuanya dalam memori dan kemudian membuangnya
SIGHUP
atau serupa). Untuk itu, alih-alih 200MB saya akan memikirkan jumlah baris yang 'masuk akal' untuk dilacak.sumber
syslog
danlogrotate
.Skrip berikut harus melakukan pekerjaan itu.
Ini memiliki beberapa jalan pintas yang jelas, tetapi secara keseluruhan itu melakukan apa yang Anda minta. Ini akan membagi log menjadi potongan dengan ukuran terbatas, dan jumlah potongan juga terbatas. Semua dapat ditentukan melalui argumen baris perintah. File log juga ditentukan melalui baris perintah.
Catat gotcha kecil jika Anda menggunakannya dengan daemon yang bercabang ke latar belakang. Menggunakan pipa akan mencegah daemon masuk ke latar belakang. Dalam hal ini ada sintaks (kemungkinan khusus untuk bash) untuk menghindari masalah:
Perhatikan
<&0
, meskipun tampak berlebihan, tidak akan berfungsi tanpa ini.sumber