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.

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.


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.



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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.