2012-02-26 14 views
9

मैं एक फाइल सिस्टम खोज रहा हूं और grep का उपयोग कर रहा हूं। मुझे लगता है कि सब कुछ जब तक यह त्रुटि दिखाई देती काम कर रहा है:Grep:/proc/sysrq-trigger: इनपुट/आउटपुट त्रुटि

Grep: /proc/sysrq-trigger: Input/output error 

मैं शुद्ध जहाँ दूसरों को एक ही समस्या करवाते आ गए हैं पर विभिन्न स्थानों में जानकारी मिल गया है, लेकिन कहीं वास्तव में वहाँ कुछ भी है कि काम किया था। मैंने 2>/dev/null की कोशिश की जिसने त्रुटि को दबाया लेकिन 'फ़ाइल को छोड़ना' नहीं था जो वास्तव में मुझे उम्मीद थी कि यह क्या करेगा। इसके बजाए यह प्रक्रिया को रोकता है (जो grep का उपयोग करने वाली एक खोज/sed प्रक्रिया है)। मुझे लगता है कि grep का उपयोग करके बहिष्करण के लिए फ़ाइलों को निर्दिष्ट करने का एक तरीका है, लेकिन मुझे आशा है कि एक और मजबूत और सुरुचिपूर्ण समाधान हो सकता है।

+0

तो 'जो कुछ भी ढूंढें' का उपयोग करें! -होल्हेनेम "/ proc/sysrq-trigger" '? –

+0

* क्यों * आप '/ proc' में फ़ाइलों को दोबारा पढ़ रहे हैं? यदि आप हमें बताते हैं कि आप व्यापक शर्तों में क्या करने की कोशिश कर रहे हैं तो हम आपकी मदद करने में सक्षम होंगे। – thkala

+0

@thkala इसमें एक निश्चित स्ट्रिंग वाली फ़ाइलों की खोज करने का प्रयास कर रहा है, फिर फ़ाइल की पूरी सामग्री हटा दें। – user1166981

उत्तर

16

ऐसा लगता है जैसे आप अपने पूरे फाइल सिस्टम पदानुक्रम को फिर से खोज रहे हैं। यह ज्यादातर प्रणालियों पर अपेक्षित काम नहीं करेगा।

लिनक्स पर कम से कम /proc और /sys वर्चुअल फाइल सिस्टम हैं - वे डिस्क पर वास्तविक फ़ाइल के अनुरूप नहीं हैं। /dev में विशेष फ़ाइलें भी वास्तविक फ़ाइलें नहीं हैं - वे आपके सिस्टम पर कुछ डिवाइसों जैसे कि हार्ड डिस्क, इनपुट डिवाइस e.t.c. से मेल खाते हैं। संशोधित करना - और, कभी-कभी, यहां तक ​​कि पढ़ने - इन निर्देशिकाओं में से किसी भी फाइल के तहत फ़ाइलों को अनियंत्रित तरीके से कभी नहीं होना चाहिए, क्योंकि आप कर्नेल को क्रैश कर सकते हैं, अपने फाइल सिस्टम को बर्बाद कर सकते हैं और यहां तक ​​कि अपने हार्डवेयर को स्थायी नुकसान भी पहुंचा सकते हैं।

find/-maxdepth 2 -type f ! -path '/proc/*' ! -path '/sys/*' 
  • -prune विकल्प का उपयोग करें:

    • उपयोग स्पष्ट -path विकल्प को नकार दिया:

      आप find उपयोग कर रहे हैं के बाद से खोज करने के लिए, आप अपनी खोज के क्षेत्र को सीमित करने की जरूरत:

      find/-maxdepth 2 -path '/proc' -prune -o -path '/sys' -prune -o -type f -print 
      
    • पूरी तरह से अन्य फ़ाइल सिस्टम के लिए उतरते से बचने के लिए -xdev विकल्प का उपयोग करें:

      find/-maxdepth 2 -xdev -type f 
      

    आप के रूप में कई -path और/या -prune विकल्प के रूप में आप फ़ाइन-ट्यून करने find के उत्पादन की जरूरत का उपयोग कर सकते हैं। हालांकि, मैं सलाह देता हूं कि आप पाइपलाइन में बाद के चरणों में से किसी एक को पार करने से पहले अपने आउटपुट का निरीक्षण करें।

    संपादित करें:

    यहाँ क्षति के कुछ उदाहरण हैं जब एक अनियंत्रित ढंग से कुछ फ़ाइलों तक पहुँचने की वजह से कर रहे हैं - root के रूप में आम तौर पर:

    • पुराने कर्नेल used to crash अगर /proc/kcoreroot के रूप में पढ़ा था। मुझे विश्वास है कि यह नहीं रह गया होता है, लेकिन मैं /proc/kcore के बाद से इस सामना करना पड़ा 2.4.x कर्नेल श्रृंखला में पेश किया गया था और यह occasionally pops up again, इसलिए मैं कोई मूड में हूँ वास्तव में यह परीक्षण करने के लिए ...

    • एक ब्लॉक डिवाइस पढ़ना /dev/ में अपने डिवाइस नोड के माध्यम से उस डिवाइस पर किसी भी अन्य ऑपरेशन को गंभीर रूप से धीमा कर सकते हैं, क्योंकि यह वीएफएस और विभिन्न कैश को छोड़ देता है।कल्पना करें, उदाहरण के लिए, सीधे 6TB RAID-5 विभाजन पढ़ना, जबकि अन्य प्रक्रियाएं स्थापित फाइल सिस्टम के माध्यम से इसे ठीक से उपयोग करने का प्रयास करती हैं। का उपयोग find में होने से इसे रोकना चाहिए।

    • चूंकि आपने संशोधन का उल्लेख किया है, इसलिए आप आसानी से अपने फर्मवेयर को दूषित करके एम्बेडेड डिवाइस को ईंट कर सकते हैं, जो /dev/mtd* के माध्यम से सुलभ है। कुछ मामलों में इस तरह के भ्रष्टाचार से कुछ बेहद चरम उपायों के बिना ठीक करना असंभव है।

  • +0

    मुझे लगता है, मुझे नहीं पता था कि आप इसे पढ़कर इसे नुकसान पहुंचा सकते हैं फ़ाइल- मुझे लगता है कि यह शायद अन्य महत्वपूर्ण प्रक्रियाओं से पहुंच को अवरुद्ध करने के कारण है? विस्तृत प्रतिक्रिया के लिए धन्यवाद, बहुत सराहना की। उदाहरण के लिए मैं एक साथ अधिक बहिष्कृत पथों को एक साथ जोड़ सकता हूं! -पाथ '/ proc/*! -पाथ '/ sys/*' आदि? – user1166981

    +0

    1. वहां * कुछ फ़ाइलें हैं जो मूल रूप से रूट के रूप में पढ़ने पर समस्याएं उत्पन्न करती हैं। '/ Proc/kcore' को पढ़ा जाने पर मेरे पुराने सिस्टम में से एक क्रैश होता था - और अगर यह कुछ मेरे RAID सरणी डिवाइस को सीधे पढ़ने की कोशिश करता है तो यह काफी परेशान होगा (हालांकि' टाइप करें 'कम से कम इसके खिलाफ सुरक्षा करनी चाहिए) – thkala

    +0

    2. आप सिर्फ पढ़ नहीं रहे हैं, आपने संशोधन का उल्लेख किया है। अब 'sed -i' सामान्य रूप से मूल को बदलने से पहले एक अस्थायी फ़ाइल पर लिखता है, जो अनावश्यक फ़ाइलों की सुरक्षा करता है, लेकिन किसी भी अन्य विधि को मूल रूप से क्षति के कारण बहुत आसानी से संशोधित किया जा सकता था। – thkala

    5

    ग्रेप एक --exclude-dir = dir विकल्प है कि आप/proc और/sys

    मैं हाल ही में इस तरह एक कमांड इस्तेमाल किया जहां मैं केवल एक पैरामीटर का नाम जानता था से बचने के लिए उपयोग कर सकते हैं कि मुझे कुछ कॉन्फ़िगरेशन फ़ाइल में होने की उम्मीद है, लेकिन फ़ाइल के पथ के बारे में कोई जानकारी नहीं थी।

    cd/&& grep -rI --exclude-dir=proc --exclude-dir=sys pattern *