कुछ समय तक चलने देने के बाद मार प्रक्रिया


13

मैं उस समय को सीमित करना चाहता हूं जब grepप्रक्रिया कमांड को चलाने या जीवित रहने की अनुमति है।

उदाहरण के लिए। मैं निम्नलिखित प्रदर्शन करना चाहता हूं:

grep -qsRw -m1 "parameter" /var

लेकिन grepकमांड चलाने से पहले मैं यह सीमित करना चाहता हूं कि grepप्रक्रिया को कितने समय तक जीना है, कहो कि 30 सेकंड से अधिक नहीं है।

मैं यह कैसे करु?

और अगर यह हो सकता है, तो मैं कैसे वापसी करूं या बाद में कोई समय सीमा न हो।


3
क्या आपने यह पहले से नहीं पूछा? stackoverflow.com/questions/3061377/…

कोई यह अन्य quastion क्योंकि मुझे नहीं जवाब मूल quastion येल पर मिलता है

4
@ यूल: आपको पहले एक अच्छा समाधान मिला, उपयोग करने का timeout, और आपको यह भी निर्देश मिला कि इसे कैसे स्थापित किया जाए। इस उत्तर को अनदेखा करना और फिर अपने प्रश्न की नकल करना अशिष्टता है।
पॉल आर

क्षमा करें, लेकिन नहीं, मैं अपने सिस्टम THX येल

5
@ येल: तो आपको इस बाधा को शामिल करने के लिए अपने मूल प्रश्न को अपडेट करने की आवश्यकता है , न कि केवल प्रश्न को दोहराएं और फिर से शुरू करें
पॉल आर

जवाबों:


12

आप समयबद्धता का उपयोग कर सकते हैं , यह डिफ़ॉल्ट ubuntu में उपलब्ध है या आप इसे स्वयं संकलित कर सकते हैं।

टाइमलीमिट एक कमांड निष्पादित करता है और किसी दिए गए सिग्नल के साथ एक निश्चित समय के बाद स्पॉन्ड प्रक्रिया को समाप्त करता है। एक "चेतावनी" संकेत पहले भेजा जाता है, फिर, समय समाप्त होने के बाद, एक "मार" संकेत, जिस तरह से init (8) शटडाउन पर संचालित होता है।


2
यह मेरे Ubuntus (10.10 डेस्कटॉप, 11.04 सर्वर) में नहीं है, इसलिए शायद यह डिफ़ॉल्ट नहीं है। लेकिन आसानी से हड़बड़ी में पकड़ लिया sudo aptitude install timelimit। एक बार स्थापित महान काम करता है।
दिन

7

यहाँ उस के लिए कुछ थोड़ा बकवास है:

grep -qsRw -m1 "parameter" /var &

GREPPID=$!

( sleep 30; kill $GREPPID ) &

fg $GREPPID

मूल रूप से, यह पृष्ठभूमि में खोज शुरू करता है, फिर एक सबस्क्रिप्शन शुरू करता है जो 30 सेकंड इंतजार करता है और फिर खोज प्रक्रिया को मारता है। यदि खोज <30s लेता है, तो प्रक्रिया पहले ही मृत हो जाएगी। यह पहले से ही मर चुकी एक प्रक्रिया को मारने के लिए एक बहुत अच्छा विचार नहीं है क्योंकि बहुत कम संभावना है कि कुछ और पीआईडी ​​का पुन: उपयोग करेगा, लेकिन इस तरह से कुछ के लिए यह आम तौर पर ठीक है। अंत में, खोज को वापस अग्रभूमि में डाल दिया जाता है और तब तक चलेगा जब तक कि यह खत्म नहीं हो जाता या मारा नहीं जाता।


$ कैसे प्राप्त करें? इस मामले में grep से क्योंकि मेरी स्क्रिप्ट में मैं $ लेता हूं? grep से और सत्यापित करें कि क्या grep स्ट्रिंग से मेल खाता है? येल

मुझे यकीन नहीं है कि ऐसा करने का एक सीधा तरीका है। इसके अलावा, यह दृष्टिकोण एक स्क्रिप्ट में काम नहीं करता है जहाँ bash में जॉब कंट्रोल सक्रिय नहीं है। स्क्रिप्ट में काम पाने के लिए आपको थोड़ा पर्ल हैकरी का सहारा लेना पड़ सकता है। हम्म ...
वाल्टर मुंड

इस सवाल का सामना करना संभव है? येल

4

"Tgrep" नामक एक नई फ़ाइल बनाएं और उसमें निम्नलिखित डालें (या जो आप चाहते हैं उसे कॉल करें):

#!/bin/bash
grep $@ &
PID=$!
sleep 30 && kill $PID 2>/dev/null &
wait $PID
exit 0

अगला, भागो chmod a+x tgrep। अब यदि आप इसका उपयोग करना चाहते हैं तो आप टाइप कर सकते हैं

./tgrep -i "results" /home/dan/*txt

या आप इसे केवल tgrep (./ के बिना और किसी भी निर्देशिका से उपयोग करने में सक्षम होने पर) के रूप में उपयोग कर सकते हैं यदि आप इसे अपने $ PATH चर (जैसे / घर / दान / बिन /) में निहित निर्देशिका में रखते हैं, तो आपके $ पाथ चर, अन्यथा आप इसे जोड़ सकते हैं)।

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