2011-08-12 10 views
7

सार: पृष्ठभूमि में एक इंटरैक्टिव कार्य कैसे चलाएं?पृष्ठभूमि खोल स्क्रिप्ट में नेटकैट/बिल्ली का उपयोग करना (रोकथाम (टीटीआई इनपुट) से कैसे बचें?)

विवरण: मैं पृष्ठभूमि कार्य के रूप में राख खोल (Busybox) के तहत इस सरल लिपि को चलाने की कोशिश कर रहा हूं।

myscript.sh &

हालांकि स्क्रिप्ट तुरंत बंद हो जाता है ...

[1] + रोका गया (tty इनपुट) myscript.sh

myscript .sh सामग्री ... (केवल अवशिष्ट हिस्सा, अन्य तो मैं सिगिनट, SIGHUP आदि जाल)

#!/bin/sh 

catpid=0 

START_COPY() 
{ 
    cat /dev/charfile > /path/outfile & 
    catpid = $! 
} 

STOP_COPY() 
{ 
    kill catpid 
} 

netcat SOME_IP PORT | while read EVENT 
do 
    case $EVENT in 
    start) START_COPY;; 
    stop) STOP_COPY;; 
    esac 
done 

सरल कमांड लाइन परीक्षणों से मुझे पता चला कि बॉट बिल्ली और नेटकैट tty से पढ़ने की कोशिश करते हैं। ध्यान दें कि इस नेटकैट संस्करण में टीटी को दबाए रखने के लिए नहीं है।

अब माइस्क्रिप्ट को रोकने से बचने के लिए क्या किया जा सकता है?

बातें मैंने कोशिश की है इसलिए किसी भी सफलता नहीं मिली:

1) netcat/बिल्ली ... </dev/tty (या tty के उत्पादन)

2) ब्लॉक चल रहा है बिल्ली युक्त और() का उपयोग कर एक सबहेल में netcat। यह काम कर सकता है लेकिन फिर बिल्ली के पीआईडी ​​को कैसे पकड़ें?

आप विशेषज्ञों के

से अधिक ...


समस्या अभी भी मौजूद। आप सभी के लिए एक साधारण परीक्षण की कोशिश करने के लिए:

1) एक टर्मिनल में रन netcat -l -p 11111 (& बिना)

2) एक और टर्मिनल रन netcat स्थानीय होस्ट में 11111 & (यह एक के बाद बंद कर देना चाहिए जबकि संदेश बंद (टीटीई इनपुट) के साथ)

इससे कैसे बचें?

+0

कोई और विशेषज्ञ नहीं? कोई उपाय? – LovelyVirus

+0

यदि आप सबप्रोसेस से इनपुट और आउटपुट कैप्चर करने के ठीक हैं, तो आप 'स्क्रिप्ट' का उपयोग कर सकते हैं। यदि यह काम नहीं करेगा, तो आप ['socat'] (http://www.dest-unreach.org/socat/doc/socat.html) पर शोध करने का प्रयास कर सकते हैं; इसमें उन्नत पीटीवाई हैंडलिंग है, लेकिन मुझे पता नहीं लगा कि एसटीडीआईएन को कैप्चर करने के लिए इसे कैसे प्राप्त किया जाए। –

+0

भ्रम स्क्रिप्ट का हिस्सा है जो काम नहीं करता है। समाज मेरे पास पर्यावरण के लिए विकल्प नहीं है (इसे वहां नहीं मिल सकता है)। नेटकैट पर/dev/ttyS0 को रीडायरेक्ट करने के लिए थक गया है और ऐसा लगता है कि यह काम कर रहा है लेकिन फिर यह सिग्नल प्राप्त करना बंद कर देता है। – LovelyVirus

उत्तर

4

क्या आप वाकई अपनी स्क्रिप्ट को दिए गए हैं या आपने सामान्य विचार को चित्रित करने के लिए केवल एक मोटा facsimile टाइप किया है? आपके प्रश्न में लिपि में कई त्रुटियां हैं जिन्हें इसे सही ढंग से चलने से रोकना चाहिए, जो मुझे आश्चर्यचकित करता है।

  1. catpid=$! में = के साथ स्पेस नहीं पंक्ति एक वैध चर काम करते हैं। अगर वह आपकी मूल लिपि में था तो मुझे आश्चर्य हुआ कि आपको कोई त्रुटि नहीं मिली थी।

  2. kill catpid लाइन विफल होना चाहिए क्योंकि शाब्दिक शब्द catpid मान्य नौकरी आईडी नहीं है। आप शायद kill "$catpid" चाहते हैं।

अपने वास्तविक प्रश्न के लिए के रूप में:

  • cat stdin से या कहीं और नहीं /dev/charfile से पढ़ रहे हैं और किया जाना चाहिए। क्या आप वाकई टीटी इनपुट पढ़ने की कोशिश कर रहे थे?

  • आप netcat < /dev/null की तरह पुनः निर्देशित netcat के इनपुट अगर आप netcat की जरूरत नहीं है कुछ भी पढ़ने के लिए करने की कोशिश की है?

+0

नहीं, यह सिर्फ एक उदाहरण था और जैसा कि आपने बताया कि टाइपो हैं। वैसे भी बिल्ली वास्तव में/dev/charfile (कमांड लाइन पर परीक्षण) से पढ़ रही है। मैंने अभी माना है कि या तो नेटकैट या बिल्ली इस स्टॉप (टीटी इनपुट) समस्या का कारण बन रही है। बिना सफलता के नेटकैट के साथ/dev/null भी कोशिश की। – LovelyVirus

9

आप शायद netcat's "-d" option चाहते हैं, जो बताता है कि यह STDIN से पढ़ने के लिए नहीं।

6

मैं पुष्टि कर सकता हूं कि -d पृष्ठभूमि में नेटकैट चलाने में मदद करेगा।

मैं के साथ एक ही मुद्दा देख रहा था:

nc -ulk 60001 | nc -lk 60002 & 

हर बार जब मैं jobs पूछे, पाइप इनपुट बंद कर देंगे।

यह तय करने के लिए निम्न आदेश बदलना:

nc -ulkd 60001 | nc -lk 60002 & 
1

मैं एक netcat कि -d विकल्प नहीं है का उपयोग करने के लिए है।

"echo -n | netcat ... &" एक प्रभावी कामकाज प्रतीत होता है: यानी अगर आपको इसका उपयोग करने की आवश्यकता नहीं है तो तुरंत नेटकैट में मानक इनपुट बंद करें।

0

के रूप में यह अभी तक वास्तव में उत्तर नहीं दिया गया है, अगर बिजीबॉक्स और -d विकल्प का उपयोग उपलब्ध नहीं है, निम्न आदेश netcat "जीवित" जब पृष्ठभूमि के लिए भेजा रखेंगे:

tail -f /dev/null | netcat ... 

netcat < /dev/null और echo -n | netcat काम नहीं किया मेरे लिए।

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