उसी इनपुट फ़ाइल में sed आउटपुट को पुनर्निर्देशित करना मेरी मशीन को गैर-जिम्मेदार क्यों बनाता है?


13

मैं sedएक बड़ी फ़ाइल (100 एमबी) में कुछ कीवर्ड बदलने की कोशिश कर रहा था । मैं -i(inplace) विकल्प से अनजान था , इसलिए मेरा पहला प्रयास इस तरह से पुनर्निर्देशित करना था:

sed 's/original/edited/g' file.log >> file.log

उसके बाद क्या हुआ कि मेरा पीसी रुक गया, लगभग कोई कीबोर्ड इनपुट नहीं था। मैं एक अलग सांत्वना की कोशिश की Ctrl+ Alt+ F1लेकिन धीरे धीरे उपयोगकर्ता नाम दर्ज करने के बाद, यह भी रुका। कीबोर्ड के बिना, मेरा एकमात्र विकल्प मशीन को हार्डवेयर-रीसेट करना था। लॉग इन करने के बाद, मैंने देखा कि फाइल.लॉग लगभग 8 जीबी था।

मैं वास्तव में यह समझना चाहूंगा कि उस कमांड का निष्पादन सिस्टम को इतना गैर-जिम्मेदार क्यों बना सकता है, और अगर सिस्टम अलर्ट को ट्रिगर करने के लिए सिस्टम स्तर पर मौजूद है और आपत्तिजनक प्रक्रिया को मार सकता है?


7
क्या यह सिंगल कोर मशीन है? यह बहुत अजीब लगता है कि यह एक आधुनिक कंप्यूटर को अपने घुटनों पर लाना चाहिए था। आपकी डिस्क भर दी, हाँ। अपने कोर में से 100% का उपयोग किया, हाँ। लेकिन एक पूर्ण दुर्घटना?
टेराडॉन

क्या उस फ़ाइल के बारे में कुछ अजीब है? यदि यह कोई समस्या नहीं है, तो क्या आप इसकी सामग्री को पास्टबिन में पोस्ट कर सकते हैं?
सेर्गेई कोलोडियाज़नी 22

इसके अलावा, आपकी स्मृति की मात्रा क्या है? क्या आप हमें आउटपुट प्रदान कर सकते हैं free -h ?
सर्गी कोलोडियाज़नी

जब आप किसी फ़ाइल को बदलना चाहते हैं, तो पहली बार स्ट्रीम संपादक का उपयोग क्यों करें? साइड इफेक्ट्स के ex -sc '%s/original/edited/ge|x' file.logबिना आपको UNIX मुहावरेदार तरीके से क्या करना चाहिए sed -i
डेविड ओंगारो

ध्यान दें कि भले ही आप इसे सही तरीके से कर रहे हों (किसी भी तरीके से लोग प्रदान कर रहे हैं), यह एक सक्रिय प्रक्रिया से संबंधित लॉग फ़ाइल में इस तरह का काम करने से हो सकता है।
रैंडम 832

जवाबों:


10

जैसा कि पहले ही कहा जा चुका है, >>फ़ाइल में संलग्न हो जाता है, इसलिए आपकी sedकमांड वहां बैठकर उन पंक्तियों को पढ़ेगी, जिनमें यह सिर्फ आउटपुट है, और फिर उन्हें अधिक आउटपुट देता है। आप, यथा-स्थान आपकी फ़ाइल को बदलने के लिए चाहते हैं तो >अभी भी काम नहीं होता है, लेकिन आपके हों जागरूक sedके -iविकल्प है, जो निश्चित रूप से आप जो चाहते है है।

यदि, हालांकि, आप पूरी तरह से आश्वस्त हैं कि आप एक फ़ाइल को स्ट्रीम के रूप में पढ़ रहे हैं, और केवल एक पास करना चाहते हैं, spongeतो moreutilsपैकेज से उपयोग करने पर विचार करें ;

sed 's/original/edited/g' file.log | sponge >> file.log

spongeEOF तक मेमोरी में स्टड से पढ़ता है, फिर अपनी सभी सामग्रियों को स्टडआउट करने के लिए डंप करता है, इसलिए sedफ़ाइल के अंत में मारा जाएगा, इसे पढ़ना बंद करें, इसे बंद करें, और फिर स्पंज इसे संलग्न करना शुरू कर देगा।


2
spongeके बारे में जानने के लिए एक अच्छी उपयोगिता है, लेकिन sedपहले से ही एक -iविकल्प है -i[SUFFIX], --in-place[=SUFFIX], edit files in place (makes backup if SUFFIX supplied):।
जोशुआ टेलर

@JoshuaTaylor, ओपी का उपयोग कर रहा था >>, जो बदले की बजाय, अपेंड >करता है। दी गई, ओपी ने विशेष रूप -iसे पोस्ट में उल्लेख किया था और ऐसा लगता है कि यह इस से कहीं अधिक सामान्य उपयोग का मामला है, लेकिन मैंने सोचा कि यह इंगित करने योग्य था कि ओपी ने जो विशिष्ट ऑपरेशन पोस्ट किया था, वह बहुत अधिक फाफ के बिना संभव था, यदि आप वास्तव में हैं सुनिश्चित करें कि यह आप करना चाहते हैं।
युम्बर्ट

1
मैंने इसका उल्लेख यहां किया क्योंकि यह स्वीकृत उत्तर की कुंजी थी । यही कारण है कि कहा, मैं कर रहा हूँ वास्तव में के बारे में जानने के लिए खुश स्पंज ; यह मेरे टूलबॉक्स के लिए एक नया टूल है, और इसके लिए एक अपवोट के योग्य है।
जोशुआ टेलर

1
आह! समझा। मैं अपने उत्तर को थोड़ा स्पष्ट कर दूंगा। इसके अलावा, अगर आपको मज़ा आया हो, तो देख spongeलें vipemoreutilsसिर्फ एक जादुई पैकेज है जो उन चीजों से भरा है जिन्हें आप कभी नहीं जानते थे कि आप की जरूरत है
ymbirtt

18

आपकी sedकमांड उस फ़ाइल को पढ़ने की कोशिश कर रही थी जो इसे करने के लिए तैयार थी। यह कभी भी एंड-टू-फ़ाइल तक नहीं पहुंचेगा, लेकिन सीपीयू के समय की बहुत कोशिश करेगा। इसीलिए ^ C (इंटरप्ट करंट प्रोसेस) का आविष्कार किया गया था।


मुझे नहीं लगता कि ^ C वहां एक विकल्प था ... यह एक HALT के पास गया, यानी कोई ब्लिंकिंग कर्सर नहीं, अटक गया!
इकोन जूल

18

आपके द्वारा पढ़ी गई फ़ाइल पर वापस लागू करना किसी भी मामले में एक अच्छा विचार नहीं है, क्योंकि आप एक बढ़ती हुई फ़ाइल के साथ समाप्त हो जाएंगे। यदि आप वास्तव में उस फ़ाइल में वापस लिखना चाहते हैं जिसे आपको -iध्वज का उपयोग करना चाहिए :

sed -i 's/original/edited/g' file.log

या यदि आप चाहते हैं कि परिवर्तन करने से पहले आप एक बैकअप बना लें तो आप -iध्वज में एक फ़ाइल प्रत्यय जोड़ सकते हैं :

sed -i.bak 's/original/edited/g' file.log

यह नामक एक फ़ाइल बनाता है file.log.bakऔर फिर परिवर्तन करता है, आपने जो फ़ाइल प्रोग्रामर में कॉल की है उसे पढ़ने की कोशिश करके हमने प्रोग्रामर कॉल में डेटा रेस लगाई है, जहाँ एक ही डेटा स्रोत के लिए अलग-अलग प्रक्रियाएँ इनपुट या आउटपुट होती हैं। । यह इसलिए भी है कि आपकी मशीन बंद हो गई।


1
मुझे आश्चर्य है कि यह स्वीकृत उत्तर है, क्योंकि यह ओपी के सवाल का जवाब नहीं देता है"I really would like to understand why the execution of that command was able to make the system so unresponsive, and if mechanisms exist at the system level to trigger alerts and kill the offending process?"
स्टीव

@Steve जैसा कि मुझे पता चला कि यह एक पड़ाव पर आया था, लेकिन दूसरे भाग के लिए आप सही हैं। मैंने इसका पता इसलिए नहीं लगाया क्योंकि मुझे इसका उत्तर नहीं पता था। हमने बड़े पैमाने पर बातचीत के बाद कमांड का परीक्षण किया और विभिन्न मशीनों और ऑपरेटिंग सिस्टम पर पूरी तरह से अलग परिणाम आए। उदाहरण: मशीन पर आर्च के साथ यह केवल फाइल को हमेशा के लिए बढ़ने देता है, लेकिन मशीन को गैर-जिम्मेदार नहीं बनाता है। मेरे उबंटू मशीन पर मुझे प्रक्रिया को मारने का मौका दिए बिना प्रश्नकर्ता के समान परिणाम मिल रहा था। उबंटू वीएम में एक ही मशीन का परीक्षण उसी पड़ाव में आया।
विदेहोनथ

एक straceदूसरे पक्ष didtn पर पूरी प्रक्रिया के अपने मशीन पर और एक अन्य उपयोगकर्ता की मशीन पर परिणाम और इस प्रजनन करते हैं। सुनिश्चित करें कि ऐसे तंत्र हैं जिनके साथ आप अनुत्तरदायी अनुप्रयोगों को मार सकते हैं, लेकिन यदि आपकी मशीन अनुत्तरदायी है, तो आपका केवल एक विकल्प शेष है, इसे रीसेट करना। मैं अभी भी इस पर परीक्षण कर रहा हूं और इससे पहले कि मुझे पूरी तरह से समझ में न आए कि वर्णित व्यवहार का क्या कारण है, मैं प्रश्न के इस भाग को संबोधित करने में असमर्थ हूं।
विदेहोनथ

यह शायद कर्नेल विन्यास में एक अंतर है, एक अलग अनुसूचक की तरह जो IO को प्राथमिकता देता है, या सिस्टम के बीच डिस्क / फाइल सिस्टम ड्राइवर में अंतर करता है। आप लोगों ने जो जांच की, वह अच्छी जानकारी है।
स्टीव

यदि आप किसी अन्य डेटा बिंदु में रुचि रखते हैं; मैं एक काफी छोटी फ़ाइल के साथ एक CentOS मशीन पर यह कोशिश की, और यह बिल्कुल मेरे स्पंज समाधान के रूप में एक ही काम किया। मैं कल्पना करता हूं कि एक छोटी फ़ाइल के sedलिए पूरी चीज़ को मेमोरी में बफर कर दिया जाएगा और फिर हैंडल को पकड़कर रखने के बजाय इसे बंद कर दिया जाएगा। ओपी में ~ 100 एमबी की फ़ाइल के साथ, यह अनिश्चित काल तक बढ़ा लेकिन मशीन को ईंट नहीं किया।
यम्बर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.