วิธีง่ายๆในการ จำกัด ขนาดไฟล์ (stdout) ในระดับเชลล์สคริปต์?


10

ตกลงนี่เป็นกรณีการใช้งานจริงมากจากมุมมองของฉัน

สมมติว่าฉันมีเปลือกหอยง่าย ๆ ที่จะบันทึกผลลัพธ์ลงในไฟล์ สิ่งนี้สามารถเป็นอะไรก็ได้ตัวอย่างเช่น tcpdump มีวิธีการทั่วไปและเล็กน้อยเพื่อให้แน่ใจว่าไฟล์ที่ส่งออกจะไม่เกินขนาดที่กำหนด?

การอยู่เบื้องหลังสิ่งนี้คือการป้องกันไม่ให้เต็มพื้นที่ว่างบนจุดเมานต์โดยไม่ได้ตั้งใจ หากฉันลืมเกี่ยวกับสคริปต์หรือจะให้ข้อมูลกิกะไบต์ต่อชั่วโมงจากนั้นงานการดีบักแบบง่ายนี้อาจนำไปสู่ความผิดพลาดของระบบที่อาจเกิดขึ้น

ตอนนี้ฉันตระหนักถึงตัวเลือกที่สร้างในเครื่องมือบางอย่าง (เช่นการรวมกันของ -W / -C ใน tcpdump) สิ่งที่ฉันต้องการคือล้มเหลวทั่วไปมาก

เรื่องสั้นสั้น - เมื่อฉันเรียกใช้สคริปต์เช่น:

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

วิธีตรวจสอบให้แน่ใจว่า output.log จะไม่ใหญ่กว่า 1GB

สคริปต์สามารถหยุดทำงานถูกฆ่าตายหรืออะไรก็ตาม

วิธีแก้ปัญหาฉันกำลังมองหาควรง่ายและง่ายโดยใช้เครื่องมือเฉพาะใน distros ยอดนิยมเช่น ubuntu / debian / fedora โดยทั่วไปบางสิ่งบางอย่างที่มีอยู่อย่างกว้างขวาง โปรแกรม multiline ที่ซับซ้อนไม่ได้เป็นตัวเลือกที่นี่โดยไม่คำนึงถึงภาษา / เทคโนโลยี

คำตอบ:


16

คุณสามารถใช้headสิ่งนี้:

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

ยอมรับ K, M, G และชอบเป็นคำต่อท้าย (ไบต์เป็นค่าเริ่มต้น) ผนวก 'B' เพื่อใช้งานฐาน 10 เวอร์ชัน


หัวติดผนังมันไม่ง่ายไปกว่านี้อีกแล้ว ขอบคุณ!
mdrozdziel

2
ดูเหมือนว่าtail -c 1Gยังใช้งานได้มีประโยชน์ในการดูส่วนท้ายของเหตุการณ์ อย่างชัดเจนว่ามันล้างหลังจากสิ้นสุดคำสั่ง
dashesy

หน่วยสำหรับส่วนต่อท้ายไม่ทำงานบน Mac OS
anumi

0

ตั้งค่าขนาดไฟล์สูงสุดสำหรับผู้ใช้ที่จะใช้เพื่อเรียกใช้สคริปต์เหล่านี้เท่านั้น

ไฟล์/etc/security/limitsจำกัด ผู้ใช้ด้วยค่า "เริ่มต้น" เว้นแต่จะมีค่าที่ชัดเจนสำหรับผู้ใช้เฉพาะ ค่าเฉพาะผู้ใช้เหล่านี้จะเขียนทับค่าเริ่มต้น ไฟล์อาจมีชื่อแตกต่างกันเล็กน้อยขึ้นอยู่กับระบบปฏิบัติการของคุณ

หากผู้ใช้บันทึกของคุณชื่อ log_maker ให้เพิ่มบรรทัดนี้ในไฟล์:

log_maker hard fsize 1000000

จำนวนหลังจาก fsize คือขนาดไฟล์สูงสุดในหน่วย KB


0

curtail จำกัด ขนาดของเอาต์พุตของโปรแกรมและเก็บรักษา X KB สุดท้ายของเอาต์พุตด้วยคำสั่งต่อไปนี้:

run_program | curtail -s 1G myprogram.log

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

หมายเหตุ: ฉันเป็นผู้ดูแล repo ด้านบน เพียงแบ่งปันโซลูชัน ...


0

คุณสามารถ จำกัด ไฟล์ด้วย

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

การเขียนส่วนท้ายลงในไฟล์เดียวกันโดยตรงจะทำให้ไฟล์ว่างเปล่า ดังนั้นคุณต้องใช้ไฟล์ชั่วคราว


tail -c 1G myLog.log> myLog.tmp mv myLog.tmp> myLog.log สิ่งนี้จะฆ่าบันทึกฉันคิดว่าคุณต้องการใช้ >> แทนที่จะเป็น>> หรือไม่คุณ?
djdomi

วัตถุประสงค์ของคำสั่งนี้คือการเขียนบันทึกใหม่ด้วย 1G ล่าสุดเท่านั้น >> ควรเป็นคำสั่งก่อนหน้านี้: doSomething >> myLog.log; tail -c 1G myLog.log> myLog.tmp; mv myLog.tmp> myLog.log;
Séverin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.