Cara mudah untuk membatasi ukuran file (stdout) pada tingkat skrip shell?

10

Ok, ini kasus penggunaan yang sangat praktis dari sudut pandang saya.

Katakanlah saya punya oneliner shell sederhana yang tidak mencatat output ke file. Ini bisa berupa apa saja, misalnya tcpdump. Apakah ada cara umum dan sepele, untuk memastikan, bahwa file output tidak akan melebihi ukuran yang diberikan?

Resoning di balik ini, adalah untuk melindungi dari mengisi seluruh ruang yang tersedia di mount point karena kesalahan. Jika saya lupa tentang skrip, atau akan menghasilkan GB data per jam, maka tugas debugging sederhana ini dapat menyebabkan potensi crash sistem.

Sekarang, saya mengetahui opsi-opsi yang dibangun di beberapa alat (seperti kombinasi -W / -C di tcpdump). Yang saya butuhkan adalah failafe yang sangat umum.

Singkat cerita - ketika saya menjalankan skrip seperti:

% this -is --my=very|awsome|script >> /var/tmp/output.log

Bagaimana memastikan bahwa output.log tidak akan pernah menjadi lebih besar dari 1GB.

Script bisa crash, terbunuh atau apa pun.

Solusi yang saya cari harus mudah dan sederhana, hanya menggunakan alat yang tersedia di distro populer seperti ubuntu / debian / fedora. Secara umum sesuatu tersedia secara luas. Rumitnya, program multiline bukanlah opsi di sini terlepas dari bahasa / teknologi.

mdrozdziel
sumber

Jawaban:

16

Anda dapat menggunakan headini:

command | head -c 1G > /var/tmp/output.log

Ia menerima K, M, G dan sejenisnya sebagai sufiks (byte adalah default). Tambahkan 'B' untuk menggunakan versi basis 10.

Eduardo Ivanec
sumber
kepala terhadap dinding Tidak mungkin lebih sederhana. Terima kasih!
mdrozdziel
2
Tampaknya tail -c 1Gjuga berfungsi, berguna untuk melihat bagian ujung suatu peristiwa. Maklum itu memerah setelah perintah berakhir.
dashesy
Unit untuk akhiran tidak berfungsi di Mac OS.
anumi
0

Tetapkan ukuran file maksimum untuk pengguna yang hanya akan digunakan untuk menjalankan skrip ini.

File /etc/security/limitsmembatasi pengguna dengan nilai "default" kecuali ada nilai eksplisit untuk pengguna tertentu. Nilai spesifik pengguna ini akan menimpa nilai default. File mungkin memiliki nama yang sedikit berbeda tergantung pada OS Anda.

Jika pengguna log Anda bernama log_maker, kemudian tambahkan baris ini ke file:

log_maker hard fsize 1000000

Jumlah setelah fsize adalah ukuran file maksimum dalam KB.

Chris Ting
sumber
0

curtail membatasi ukuran output program dan mempertahankan output X KB terakhir dengan perintah berikut:

run_program | curtail -s 1G myprogram.log

https://github.com/Comcast/Infinite-File-Curtailer

CATATAN: Saya adalah pengelola repo di atas. Hanya berbagi solusinya ...

Dave Wolaver
sumber
0

Anda dapat membatasi file apa pun dengan

tail -c 1G myLog.log > myLog.tmp
mv myLog.tmp > myLog.log

Menulis ekor langsung ke file yang sama membuat file kosong. Jadi, Anda perlu menggunakan file sementara.

Séverin
sumber
tail -c 1G myLog.log> myLog.tmp mv myLog.tmp> myLog.log ini akan mematikan log, saya pikir Anda ingin menggunakan >> bukan> atau bukan?
djdomi
Tujuan dari perintah ini adalah untuk menulis ulang log hanya dengan 1G terakhir. >> harus untuk perintah sebelumnya: doSomething >> myLog.log; tail -c 1G myLog.log> myLog.tmp; mv myLog.tmp> myLog.log;
Séverin