2011-02-02 15 views
6

मैं नामित पाइप के साथ रूट प्रक्रिया में कुछ डेटा भेजना चाहता हूं। यहां स्क्रिप्ट है और यह बहुत अच्छा काम करता है:गैर-अवरुद्ध पढ़ने के साथ बैश स्क्रिप्ट

#!/bin/sh 
pipe=/tmp/ntp 

if [[ ! -p $pipe ]]; then 
    mknod -m 666 $pipe p 
fi 

while true 
do 
    if read line <$pipe; then 
     /root/netman/extra/bin/ntpclient -s -h $line > $pipe 2>&1 
    fi 
done 

मेरे पास वास्तव में इस तरह की कई स्क्रिप्ट हैं। मैं उन सभी को एक ही लिपि में संलग्न करना चाहता हूं। समस्या यह है कि पहले "पढ़ने" पर निष्पादन ब्लॉक और मैं एक ही प्रक्रिया में एकाधिक "पढ़ता" निष्पादित नहीं कर सकता। क्या मैं कुछ भी नहीं कर सकता? क्या "गैर-अवरुद्ध" बैश पढ़ना संभव है?

+0

आप अलग-अलग संचालन को एकल में क्यों जोड़ना चाहते हैं स्क्रिप्ट? यदि वे प्रत्येक सही ढंग से स्टैंडअलोन काम करते हैं, तो उन्हें स्टैंडअलोन छोड़ दें। गैर-अवरुद्ध पढ़ने में खोल को झुकाव करने की कोशिश करने से कहीं अधिक आसान है। प्रक्रियाएं सस्ते हैं। सरल प्रक्रिया जटिल लोगों की तुलना में अधिक सुरक्षित होती है, और रूट प्रक्रियाओं को सुरक्षित होने की आवश्यकता होती है। –

+0

मैं आपसे सहमत हूं, लेकिन प्रत्येक प्रक्रिया 628 के रैम खाती है (यह बैश की एक प्रति है) और मैं एक एम्बेडेड वातावरण में हूं। मैं जितना संभव हो उतना स्मृति बचाने के लिए पसंद करेंगे। – michelemarcon

+0

यदि यह एक समस्या है, तो सी –

उत्तर

3

इसके कुछ बस पृष्ठभूमि में पढ़ने चक्र डाल (किया के बाद & जोड़ें)?

-t timeout 
    Cause read to time out and return failure if a complete line of input is not 
    read within timeout seconds. This option has no effect if read is not reading 
    input from the terminal or a pipe. 

यह आपको इस समस्या को हल करने में मदद करना चाहिए:

+0

बढ़िया! मैंने स्मृति खपत को कम कर दिया है! – michelemarcon

+0

@michelemarcon: क्या आप वाकई मेमोरी को सहेज रहे हैं? जब मैंने इसका परीक्षण किया, तो '&' को जोड़कर लूप को सबहेल में निष्पादित करने के लिए मजबूर किया गया = दूसरी प्रक्रिया = अधिक मेमोरी का उपयोग किया गया। –

+0

पीएस के साथ परीक्षण किया गया, प्रत्येक स्क्रिप्ट 628K खाती है। 'और' के साथ, प्रत्येक प्रक्रिया 240K खाती है। और बीटीडब्लू, चूंकि प्रत्येक 'समय' पृष्ठभूमि पर है, इसलिए "मां" लिपि निकलती है और इसकी याददाश्त – michelemarcon

0

आप टाइमआउट सेट करने के लिए स्टाटी का उपयोग कर सकते हैं। IIRC तरह

stty -F $pipe -icanon time 0 
+0

में कोड लिखें मुझे अमान्य तर्क मिलता है। लेकिन शायद यह इसलिए है क्योंकि मैं व्यस्त बॉक्स के साथ काम कर रहा हूं [http://en.wikipedia.org/wiki/Busybox] – michelemarcon

+0

@michelemarcon मुझे वही चीज़ मिलती है, और मैं वर्तमान में व्यस्त बॉक्स का उपयोग नहीं कर रहा हूं। लेकिन जब मैं हूं, तो मुझे यह पृष्ठ बेहद उपयोगी पाया गया है: http://www.busybox.net/BusyBox.html –

+0

मुझे उबंटू 12 के साथ भी एक अवैध तर्क त्रुटि मिलती है।04. – Hibou57

13

बैश के पढ़ने एम्बेडेड आदेश टाइमआउट सेट करने के लिए आयकर पैरामीटर है।

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

वहाँ कुछ प्रतिबंध के रूप में आदमी पेज को इंगित करता है इस समाधान के लिए काम करने के लिए कर रहे हैं: यह विकल्प कोई प्रभाव नहीं करता है, तो पढ़ टर्मिनल या एक पाइप से इनपुट पढ़ नहीं रहा है।

तो अगर मैं/tmp में एक पाइप बनाने के लिए: हमेशा के लिए

$ read -t 1 </tmp/pipe ; echo $? 

हैंग:

mknod /tmp/pipe p 

पाइप से सीधे पढ़ना काम नहीं कर रहा।

$ cat /tmp/pipe | (read -t 1 ; echo $?) 
1 

यह काम कर रहा है लेकिन बिल्ली बाहर नहीं जा रही है।

$ read -t 1 <&7 ; echo $? 
1 

या read की -u विकल्प: पुनर्निर्देशन का उपयोग कर

$ exec 7<>/tmp/pipe 

और फिर इस फाइल वर्णनकर्ता या तो से पढ़ें:

एक समाधान के लिए एक फ़ाइल वर्णनकर्ता के लिए पाइप आवंटित करने के लिए है

$ read -t 1 -u 7 ; echo $? 
1 
+0

* यदि इस विकल्प को टर्मिनल या पाइप से इनपुट नहीं पढ़ रहा है, तो इस विकल्प का कोई प्रभाव नहीं पड़ता है। * इसमें कुछ प्रभाव है। मैं कामकाजी उदाहरणों को शामिल करने के लिए उत्तर संपादित कर रहा हूं – gabuzo

+0

अभी भी मेरे लिए काम नहीं करता है, लेकिन हो सकता है कि मैं एक अनुकूलित बैश चला रहा हूं। – michelemarcon

+0

क्या 'read -h'' -t' विकल्प के साथ एक सहायता संदेश प्रदर्शित करता है? – gabuzo

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