2011-11-11 10 views
15

के साथ इंटरप्ट लूप मैं अधिक से अधिक प्रतिलिपि का उपयोग कर रहा हूं जहां मैं आमतौर पर बैश स्क्रिप्ट का उपयोग करता। एक छोटी परेशानी यह है कि इनमें से कई स्क्रिप्ट्स कुछ system() कॉल पर लूप करती हैं जो कॉल को मूल रूप से मेरे नियंत्रण को पकड़ने के लिए छोड़ती है-सी अगर मैं इसे बाधित करने का प्रयास करता हूं। इसके बजाए यह सिस्टम कमांड को बंद कर देता है जो चल रहा था और अगले लूप पुनरावृत्ति पर जारी है।सिस्टम कमांड

for(i in 1:10) { 
    cat(i) 
    system('sleep 3') 
} 

अब तक मैं हमेशा बस प्रत्येक पाश में एक छोटा सा ठहराव डालने से यह चारों ओर हैक कर लिया है: उदाहरण के लिए, जब मैं नियंत्रण-सी दबाए रखकर निम्नलिखित में दखल देने की कोशिश, यह अभी भी यह सब पुनरावृत्तियों के माध्यम से करता है जैसे

for(i in 1:10) { 
    Sys.sleep(0.25) 
    cat(i) 
    system('sleep 3') 
} 

मुझे एक या दो यात्रा के भीतर गर्भपात अगर मैं नियंत्रण-सी दबाए रखें देंगे, लेकिन मैं सोच रहा हूँ, वहाँ एक और अधिक कुशल तरीके से इस व्यवहार को पूरा करने के लिए है?

+0

शानदार सवाल। मैंने कुछ गोरस को पढ़ा है कि कोई भी अच्छी तरह से लिखित कार्यक्रम ब्रेक कीस्ट्रोक के लिए सुन रहा होगा, लेकिन ऐसा लगता है कि कई (और निश्चित रूप से मेरे सभी) उस सुविधा के साथ नहीं लिखे गए हैं। –

+0

हाँ यहाँ वही! यह मुझे खराब करता है क्योंकि ये हाउसकीपिंग स्क्रिप्ट आमतौर पर प्रयोग निर्देशिका क्षेत्रों को स्थापित करने के लिए होती हैं, इसलिए बहुत तेज़ 'mkdir', 'chmod',' ln', आदि, कमांड का उपयोग करें। लेकिन जब मुझे 1000 विषयों के लिए ऐसा करना होता है, तब भी जब मैं एक रन चलाता हूं तो वहां केवल 5 मिनट के करीब कचरे में 0.25 सेकेंड विराम होता है। –

+0

AFAIK एक आर लूप एक अलग प्रक्रिया नहीं है, इसलिए '% kill-9 $ PID' काम नहीं करेगा। लेकिन, मुझे पूछने दो: आपको मारने की क्या ज़रूरत है? यदि यह एक लूप खत्म हो गया है, तो 1: 10000 कहें, आप एक प्रॉम्प्ट() में डाल सकते हैं जो प्रत्येक 1000 चक्र चलाता है। यदि आप एक ऐसी स्क्रिप्ट चला रहे हैं जो बहुत लंबा है और आपने इसे शुरू करने के बाद अपना मन बदल दिया है, तो, यह आपकी खुद की गलती है :-)। –

उत्तर

3

जॉन, मुझे यकीन नहीं है कि इससे मदद मिलेगी, लेकिन setTimeLimit की जांच से, मैंने सीखा कि जब भी उपयोगकर्ता एक बाधा को निष्पादित करने में सक्षम होता है, तो Ctrl-C की तरह निष्पादन रोक सकता है। कुछ संदर्भों के लिए this question देखें।

विशेष रूप से, कॉलबैक जाने का तरीका हो सकता है, और मैं addTaskCallback और this guide on developer.r-project.org देखेंगे।

यहाँ चार अन्य सुझाव हैं:

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

  2. आप foreach बजाय for उपयोग कर सकते हैं (या तो समानांतर में,% dopar%, या धारावाहिक% के माध्यम से% के बजाय% dopar% या w/केवल 1 पंजीकृत कार्यकर्ता करते हैं), इस रुकावट के लिए और अधिक उत्तरदायी हो सकता है, क्योंकि यह पहले सुझाव के बराबर हो सकता है (चूंकि यह फोर्क आर)।

  3. यदि आप बाहरी कमांड के लिए निकास कोड पुनर्प्राप्त कर सकते हैं, तो उसे लूप सशर्त में पारित किया जा सकता है। This previous Q&A उस संबंध में सहायक होगा।

  4. यदि आप सब कुछ एक बैश स्क्रिप्ट में चलाना चाहते हैं, तो आर सिर्फ एक लंबी लिपि लिख सकता है (यानी एक स्ट्रिंग या स्ट्रिंग्स की एक फ़ाइल को फाइल में आउटपुट)। इसे निष्पादित किया जा सकता है और अंतराल की गारंटी है कि लूप को प्रभावित न किया जाए, क्योंकि आपने लूप को अनलॉक कर दिया है। वैकल्पिक रूप से, आप बैश में लूप लिख सकते हैं। Here are examples। निजी तौर पर, मैं find (उदा। find .... -exec doStuff {} ';') या बैकक्वॉट्स के माध्यम से इनपुट के रूप में फ़ाइलों को कमांड लागू करना पसंद करता हूं। दुर्भाग्यवश, मैं आसानी से एसओ पर अच्छी तरह से स्वरूपित कोड नहीं दे सकता, क्योंकि यह बैकक्वॉट्स के अंदर बैकक्वॉट एम्बेड करता है ... See this page for examples तो, यह मामला हो सकता है कि आपके पास एक कमांड हो, कोई लूपिंग न हो और सभी फ़ाइलों में कोई फ़ंक्शन लागू न हो मानदंडों के एक विशेष सेट को पूरा करना। बैकक्वॉट्स के माध्यम से कमांड प्रतिस्थापन का उपयोग करना एक बैश उपयोगकर्ता के लिए एक बहुत ही आसान चाल है।

+0

इसके लिए धन्यवाद, @ इटरेटर। मैं पिछले कुछ दिनों में अपने दिमाग के पीछे कुछ और चबाने लगा रहा हूं। कॉलबैक आधारभूत संरचना ध्वनि का वादा करता है। मुझे चिंता है कि यह एक ही समस्या पर आ जाएगा जो मुझे ऊपर डब्लूविन के विचार का उपयोग करने से रोकता है: मुझे ऐसे फ़ंक्शन के बारे में पता नहीं है जो "एक कुंजी प्रेस के लिए जांचता है" या "बटन के लिए चेक" या कुछ ऐसा उस। मुझे निश्चित रूप से उस दस्तावेज़ में से कुछ को और अधिक बारीकी से पढ़ने की आवश्यकता है, क्योंकि वहां कुछ विवरण हैं ... –

+0

अन्य सुझाव भी उपयोगी होंगे। # 1 और 2 विशेष रूप से लंबी स्क्रिप्ट के लिए, जहां मैं पहले से ही हमारे क्लस्टर शेड्यूलर का उपयोग करता हूं जो चीजों को मारना आसान है। हालांकि छोटी/सरल छोटी लिपियों के लिए, मैं अभी भी चाहता हूं कि एक आसान तरीका था। # 3 मुझे लगता है कि विशेष रूप से उपयोगी होगा, क्योंकि इनमें से कई टूल बाधित होने पर असामान्य स्थिति का उत्पादन करते हैं। –

+0

इस सब के बाद, हालांकि, मुझे आश्चर्य है कि क्या मैं एक गोल छेद में एक वर्ग चरम फिट करने के लिए बहुत मेहनत कर रहा हूं। यह करना आसान है 'मैं 1 में ... एन; कर ...; बैश में किया गया है कि उन परिस्थितियों के लिए जो वास्तव में * सरल हैं, शायद मुझे बस इसके साथ रहना चाहिए? मुझे पता नहीं ... –

0

आप की जाँच की जानी चाहिए कि system() के लिए हर कॉल एक गैर शून्य बाहर निकलने का दर्जा प्राप्त है। यदि कोई अनपेक्षित त्रुटि है, तो आपके प्रोग्राम को stop() होना चाहिए, या आप अप्रत्याशित परिणाम प्राप्त कर सकते हैं। Ctrl + सी के साथ मारे जाने वाले प्रोग्रामों को गैर-शून्य निकास स्थिति लौटाई जानी चाहिए, और यदि वे नहीं करते हैं, तो यह उन कार्यक्रमों में एक बग या दोष है।

+0

असल में मैं सिर्फ साथ '(प्रणाली (" नींद "," 40 "))' जो त्रुटि दर्शाता है नहीं करता है, भले ही यह बैश करता है के भीतर कर रही है, तो हो सकता है मेरी उपरोक्त कथन गलत है यह परीक्षण किया गया। –

संबंधित मुद्दे