शेल स्क्रिप्ट स्तर पर फ़ाइल आकार (स्टडआउट) को सीमित करने का आसान तरीका?


10

ठीक है, यह मेरे दृष्टिकोण से एक बहुत ही व्यावहारिक उपयोग का मामला है।

मान लीजिए कि मेरे पास कुछ सरल शेल ऑनलाइनर हैं जो आउटपुट को एक फ़ाइल में लॉग करता है। यह कुछ भी हो सकता है, उदाहरण के लिए tcpdump। क्या कोई सामान्य और तुच्छ तरीका है, यह सुनिश्चित करने के लिए कि आउटपुट फ़ाइल को आकार नहीं दिया जाएगा?

इसके पीछे, गलती से माउंट बिंदु पर पूरे उपलब्ध स्थान को भरने से बचाने के लिए है। यदि मैं स्क्रिप्ट के बारे में भूल जाता हूं, या यह प्रति घंटे जीबी डेटा प्राप्त करेगा, तो इस सरल डिबगिंग कार्य से संभावित सिस्टम क्रैश हो सकता है।

अब, मुझे कुछ टूल में निर्मित विकल्पों के बारे में पता है (जैसे tcpdump में -W / -C का संयोजन)। मुझे जो चाहिए वह बहुत सामान्य असफल है।

लंबी कहानी छोटी - जब मैं एक स्क्रिप्ट चलाता हूं:

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

यह कैसे सुनिश्चित करें कि output.log 1GB से बड़ा कभी नहीं मिलेगा।

स्क्रिप्ट क्रैश हो सकती है, मारी जा सकती है या जो भी हो।

समाधान मैं देख रहा हूँ आसान और सरल होना चाहिए, ubuntu / debian / fedora जैसे लोकप्रिय डिस्ट्रो में उपलब्ध उपकरणों का उपयोग करना। सामान्य रूप से व्यापक रूप से उपलब्ध कुछ में। भाषा / तकनीक की परवाह किए बिना जटिल, बहुस्तरीय कार्यक्रम यहां कोई विकल्प नहीं है।

जवाबों:


16

आप इसके लिए उपयोग कर सकते हैं head:

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

यह K, M, G और जैसे प्रत्यय (बाइट्स डिफ़ॉल्ट हैं) को स्वीकार करता है। आधार 10 संस्करणों का उपयोग करने के लिए 'बी' को जोड़ें।


सिर फिर से दीवार यह अधिक सरल नहीं हो सकता। धन्यवाद!
mdrozdziel

2
यह tail -c 1Gएक घटना की पूंछ को देखने के लिए उपयोगी भी काम करता है। कमांड खत्म होने के बाद समझ में आता है।
डेसी

प्रत्यय के लिए इकाई मैक ओएस पर काम नहीं करती है।
शामि 15:22

0

एक उपयोगकर्ता के लिए अधिकतम फ़ाइल आकार सेट करें जो केवल इन लिपियों को चलाने के लिए उपयोग किया जाएगा।

फ़ाइल /etc/security/limitsएक उपयोगकर्ता को "डिफ़ॉल्ट" के मूल्यों के साथ सीमित करती है जब तक कि किसी विशिष्ट उपयोगकर्ता के लिए स्पष्ट मूल्य नहीं होते हैं। ये उपयोगकर्ता विशिष्ट मान डिफ़ॉल्ट मानों को अधिलेखित कर देंगे। आपके OS के आधार पर फ़ाइल में थोड़ा अलग नाम हो सकता है।

यदि आपके लॉग यूजर का नाम log_maker है, तो इस लाइन को फाइल में जोड़ें:

log_maker hard fsize 1000000

Fsize के बाद की संख्या KB में अधिकतम फ़ाइल आकार है।


0

घटता एक प्रोग्राम के आउटपुट के आकार को सीमित करता है और निम्न कमांड के साथ आउटपुट के अंतिम X KB को संरक्षित करता है:

run_program | curtail -s 1G myprogram.log

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

नोट: मैं उपरोक्त रेपो का अनुचर हूं। बस समाधान साझा कर रहा हूं ...


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;
सेवरिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.