उन लोगों के लिए, जिनके पास लगातार लिखने के लिए एक कार्यक्रम है, आपको केवल 'सिंगल मैच' विकल्प के साथ इसे संक्षिप्त करना है। एक बार grep मिलान स्ट्रिंग को खोज लेता है, तो यह बाहर निकल जाएगा, जो उस प्रक्रिया पर स्टडआउट को बंद कर देता है जिसे grep पर पाइप किया जा रहा है। इस घटना को चाहिए स्वाभाविक रूप से कार्यक्रम शान से बाहर निकलने के लिए कारण इतने लंबे समय के रूप में इस प्रक्रिया को फिर से लिखते हैं ।
क्या होगा कि यह प्रक्रिया SIGPIPE को प्राप्त होगी जब यह grep से बाहर निकलने के बाद बंद स्टडआउट को लिखने की कोशिश करता है। यहाँ पिंग के साथ एक उदाहरण है, जो अन्यथा अनिश्चित काल तक चलेगा:
$ ping superuser.com | grep -m 1 "icmp_seq"
यह आदेश पहले सफल 'पोंग' से मेल खाएगा, और फिर अगली बार बाहर निकलने की ping
कोशिश करता है कि लेखन को रोकना है।
तथापि,
यह हमेशा गारंटी नहीं है कि प्रक्रिया फिर से रोकना लिख देगी और इसलिए SIGPIPE को उठाया नहीं जा सकता है (उदाहरण के लिए, किसी लॉग फ़ाइल को पूंछते समय ऐसा हो सकता है)। इस परिदृश्य के लिए जो सबसे अच्छा समाधान मैंने तैयार किया है, उसमें फ़ाइल में लिखना शामिल है; कृपया टिप्पणी करें यदि आपको लगता है कि आप सुधार कर सकते हैं:
$ { tail -f log_file & echo $! > pid; } | { grep -m1 "find_me" && kill -9 $(cat pid) && rm pid; }
इसे तोड़ना:
tail -f log_file & echo $! > pid
- एक फ़ाइल पूंछता है, पृष्ठभूमि के लिए प्रक्रिया संलग्न करता है, और $!
एक फ़ाइल के लिए पीआईडी ( ) बचाता है । मैंने इसके बजाय PID को एक चर में निर्यात करने की कोशिश की, लेकिन ऐसा लगता है कि यहां और जब PID का फिर से उपयोग किया जाता है, तो एक दौड़ की स्थिति होती है।
{ ... ;}
- इन आदेशों को एक साथ समूहित करें ताकि हम वर्तमान संदर्भ को बनाए रखते हुए grep में आउटपुट कर सकें (चर को बचाने और पुन: उपयोग करने में मदद करता है, लेकिन उस हिस्से को काम करने में सक्षम नहीं किया गया)
|
- पाइप लेफ्ट साइड के स्टडआउट से राइट साइड के स्टड पर
grep -m1 "find_me"
- लक्ष्य स्ट्रिंग ढूंढें
&& kill -9 $(cat pid)
- बल मार (SIGKILL) tail
प्रक्रिया के grep
बाहर निकलने के बाद एक बार मिलान स्ट्रिंग को ढूंढता है
&& rm pid
- हमारे द्वारा बनाई गई फ़ाइल को हटा दें
tail -f
एक प्रोग्राम आउटपुट के साथ-साथ एक फ़ाइल के लिए संभव था ... क्या मैं गलत हूं?