शुद्ध bash, बिना कोर्यूटिल्स के बनाया गया
मैंने पाया कि यह समाधान बाहरी निष्पादन योग्य कॉल के बिना अंतर्निहित कमांड bashपर निर्भर करने में काम करता है । यह उस प्रणाली पर काम करता है जहां अंततः कोर्यूटिल्स भी स्थापित नहीं किए गए हैं [ 1 ]
YourCommand & read -t 300 ; kill $! # 1st version
YourCommand & read -t 300 || kill $! # 2nd version
स्पष्टीकरण : हमेशा की तरह जब आप एक आदेश के साथ पृष्ठभूमि में भेज &, अपने पीआईडी आंतरिक चर में संग्रहीत किया जाता है $!(के आधुनिक संस्करण में मौजूद dash, csh, bash, tcsh, zsh...)।
गोले के बीच वास्तव में क्या फर्क पड़ता है यह अंतर्निहित कमांड read[ 2 ] और विकल्प की उपस्थिति है -t। 1 संस्करण में यदि उपयोगकर्ता सेकंड की निर्दिष्ट राशि से पहले इनपुट की एक पंक्ति को पूरा नहीं करेगा, तो अनुदेश समाप्त हो जाएगा और एक त्रुटि वापसी कोड उत्पन्न होगा।
-TIMEOUT कारण समय से बाहर पढ़ने के लिए और विफलता की वापसी अगर इनपुट की पूरी लाइन TIMEOUT सेकंड के भीतर नहीं पढ़ी जाती है।
दूसरा संस्करण 1 के रूप में काम करता है, लेकिन आप सिर्फ दबाने के लिए हत्या को समाप्त कर सकते हैं enter।
वास्तव में या ऑपरेटर केवल स्टेटमेंट को ||निष्पादित करता है killयदि readकमांड शून्य से अलग रिटर्न कोड के साथ बाहर निकलता है, जैसे कि समय समाप्त होने पर। यदि आप enterउस क्षण से पहले दबाते हैं, तो यह 0 पर वापस आ जाएगा और यह आपकी पिछली कमांड को नहीं मारेगा।
Coreutils समाधान [ 1 ]
जब coreutils अपने सिस्टम पर मौजूद हैं और आप समय और संसाधनों को एक बाहरी प्रोग्राम कॉल करने के लिए बचाने के लिए कोई जरूरत नहीं है, timeoutऔर sleepऔर दोनों सही अपने लक्ष्य तक पहुँचने के तरीके हैं।
timeoutका उपयोग timeoutसीधा है।
आखिरकार आप -kपहले फेल होने पर अतिरिक्त किल सिग्नल भेजने के विकल्प का उपयोग करने पर विचार कर सकते हैं ।
timeout 5m YourCommand # 3rd version
sleep
साथ sleepआप अपनी कल्पना का उपयोग करें या कुछ प्रेरणा ले जा सकते हैं [ 3 ] । ध्यान दें कि आप पृष्ठभूमि में या अग्रभूमि में अपनी कमान छोड़ सकते हैं (उदाहरण के लिए topआमतौर पर अग्रभूमि में होना चाहिए)।
YourCommand & sleep 5m; kill $! # 4th Background
YourCommand & pid=$! ; (sleep 5m; kill $pid;) & # 5th Background
bash -c '(sleep 5m; kill $$) & exec YourCommand' # 6th Foreground
(cmdpid=$BASHPID; (sleep 5m; kill $cmdpid) & exec YourCommand) # 7th Foreground
स्पष्टीकरण
- 4 वें संस्करण में आप पृष्ठभूमि में निष्पादित
YourCommandकरते हैं तो आपका खोल sleep5 minuites के लिए है। जब यह अंतिम पृष्ठभूमि प्रक्रिया समाप्त हो $!जाएगी ( ) को मार दिया जाएगा। तुम अपना खोल बंद करो।
-
5 वें संस्करण में इसके बजाय आप पृष्ठभूमि में निष्पादित करते हैं
YourCommandऔर आप तुरंत उस पीआईडी को चर में संग्रहीत करते हैं $pid। फिर आप पृष्ठभूमि में 5 मिनट की एक झपकी और इसके परिणामस्वरूप कमांड निष्पादित करते हैं जो उस संग्रहीत पीआईडी को मार देगा। चूंकि आपने आदेशों के इस समूह को पृष्ठभूमि में भेजा है इसलिए आप अपने शेल को बंद नहीं करते हैं। आपको पीआईडी को एक चर में संग्रहीत करने की आवश्यकता है क्योंकि $!पृष्ठभूमि में किसी अन्य कार्यक्रम के अंतिम निष्पादन द्वारा मूल्य को अपडेट किया जा सकता है। सरल शब्दों में, आप गलत प्रक्रिया या किसी भी प्रक्रिया को मारने के लिए जोखिम से बचते हैं।
- 6 वें संस्करण में इसे एक नया बैश शेल कहा जाता है जो 5 मिनट में खुद को आत्महत्या कर लेगा
$$, फिर इसे आपके कमांड को निष्पादित किया जाता है जो अग्रभूमि में रहता है।
- 7 वें संस्करण में, यह एक सबशेल को आमंत्रित करता है
()जो अपने पीआईडी को एक चर ( cmdpid) में संग्रहीत करता है और खुद को पृष्ठभूमि निष्पादन में भेजे गए एक और उपधारा के साथ मारता है, फिर अग्रभूमि में YourCommand चलाएं।
निश्चित रूप से प्रत्येक संस्करण में आप अपनी आवश्यकता के अनुसार किल सिग्नल भेज सकते हैं, डिफ़ॉल्ट रूप से चरम पर kill -9 , केवल तभी उपयोग किया जा सकता है जब वास्तव में आवश्यकता हो।
संदर्भ
- [ १ ] कोरुटिल्स
- [ २ ] द बैश बिगिनर्स गाइड
- [ ३ ] बाशफा