2013-07-29 8 views
9

मैं अपने सर्वर पर एक आवेदन शुरू करने के लिए उम्मीद का उपयोग कर रहा अपेक्षा में:पृष्ठभूमि प्रक्रिया पैदा की

!/usr/bin/expect 

set timeout -1 

spawn "bin/start-all.sh" 
expect { 
    -re "Found MongoDB in" { send "y\r"; exp_continue } 
    -re "Found Hadoop in" { send "y\r"; exp_continue } 
    -re "Going to start Hadoop" { interact } 
} 

मैं जबकि स्क्रिप्ट चल रही है कुछ ही सेकंड में अपने सर्वर पर आवेदन का उपयोग कर सकते हैं, लेकिन जैसे ही यह समाप्त होता है एप्लिकेशन अनुपलब्ध हो जाता है।

मैं डिबग मोड में उम्मीद और अंत में निम्नलिखित आउटपुट प्राप्त हुई:

expect: does "vendors area. Do you want to start it? [y/n] y\r\n" (spawn_id exp6) match regular expression "Found MongoDB in"? Gate "Found MongoDB in"? gate=no 
"Found Hadoop in "? Gate "Found Hadoop in "? gate=no 
"Going to start Hadoop"? Gate "Going to start Hadoop"? gate=no 
Going to start Hadoop... 

expect: does "vendors area. Do you want to start it? [y/n] y\r\nGoing to start Hadoop...\r\n" (spawn_id exp6) match regular expression "Found MongoDB in"? Gate "Found MongoDB in"? gate=no 
"Found Hadoop in "? Gate "Found Hadoop in "? gate=no 
"Going to start Hadoop"? Gate "Going to start Hadoop"? gate=yes re=yes 
expect: set expect_out(0,string) "Going to start Hadoop" 
expect: set expect_out(spawn_id) "exp6" 
expect: set expect_out(buffer) "vendors area. Do you want to start it? [y/n] y\r\nGoing to start Hadoop" 
tty_raw_noecho: was raw = 0 echo = 1 
interact: received eof from spawn_id exp6 
tty_set: raw = 0, echo = 1 
tty_set: raw = 5, echo = 0 

मैं का उपयोग कर की कोशिश की है exit 0, interact, exp_continue, disconnect, sleep 10 पिछले पैटर्न के तहत, साथ ही eof की उम्मीद है लेकिन कुछ भी काम नहीं कर रहा है। मैंने expect start-all.exp & चलाने का भी प्रयास किया है लेकिन यह या तो काम नहीं करता है।

जब मैं मैन्युअल रूप से bin/start-all.sh चलाता हूं, तो स्क्रिप्ट आवश्यक प्रक्रियाएं शुरू करती है और फिर बाहर निकलती है। हालांकि उम्मीद है कि उन प्रक्रियाओं को मारने लगते हैं। मैं इस मुद्दे को कैसे ठीक करूं?

+0

बहुत सारी जानकारी है, लेकिन यह स्पष्ट नहीं है कि आप क्या हासिल करने की कोशिश कर रहे हैं। –

+1

यह एक लंबा शॉट है, लेकिन क्या आपने अंत में 'eof' की उम्मीद की है? –

+0

मुझे डर है कि मैं इस start-all.sh स्क्रिप्ट से परिचित नहीं हूं। यह संभव है कि जब यह उम्मीदवार के पीटीई में भाग लेता है तो यह अजीब कुछ कर रहा है जिसके परिणामस्वरूप यह समय-समय पर समाप्त हो जाता है। – user108471

उत्तर

0

एक ऐसी चीज जो मुझे लगभग सभी परिस्थितियों में काम करने के लिए मिली है जहां कार्यक्रम अपेक्षाओं में अजीब तरह से चलते हैं, स्क्रीन उदाहरण में एक खोल को जन्म देना और वहां से प्रोग्राम चलाएं।

spawn screen bash 
send "bin/start-all.sh\r" 

ऐसा करने का प्रयास करें और देखें कि यह आपके समयपूर्व ईओफ़ मुद्दे को हल करता है या नहीं।

+0

इस समाधान के साथ आप अपेक्षाकृत स्क्रिप्ट को कई बार निष्पादित करने के बाद बहुत सारे स्क्रीन सत्र चला सकते हैं। – Bogdan

+0

@ बोगदान आवश्यक नहीं है। मूल प्रश्न के मुताबिक, जब स्क्रिप्ट को मैन्युअल रूप से चलाया जाता है तो यह स्क्रिप्ट के अंत में प्रारंभिक बाल प्रक्रियाओं को मारने के बिना खुशी से बाहर निकलता है। यदि स्क्रीन सत्र में एक ही स्क्रिप्ट चलाना मैन्युअल रूप से स्क्रिप्ट चलाने की तरह व्यवहार करता है, तो आप अंत में स्क्रीन सत्र को उन प्रक्रियाओं को मारने के बिना मारने में सक्षम होना चाहिए। उन स्क्रीन सत्रों को लंबे समय तक चलने की आवश्यकता नहीं है। – user108471

5

मुझे एक ही समस्या थी और इसे समझ लिया गया।

जब expect बाहर निकलता है, तो यह SIGHUP (हैंगअप सिग्नल) उत्पन्न उपप्रजाय को भेजता है। डिफ़ॉल्ट रूप से, यह SIGHUP स्पॉन्डेड प्रक्रिया को समाप्त करने का कारण बनता है।

यदि आप अंतर्निहित प्रक्रिया SIGHUP से मरना नहीं चाहते हैं तो आपके पास दो आसान विकल्प हैं। दोनों अच्छी तरह से काम करते हैं:

1) spawn लाइन इस तरह में expect पूछो अंतर्निहित प्रक्रिया बनाने के लिए उपेक्षा SIGHUP:

#!/usr/bin/expect -f 
... 
spawn -ignore HUP command args... 
... 
expect_background 

2) यह क्या अपने आप को - अंतर्निहित प्रक्रिया अपने आप में SIGHUP उपेक्षा:

यहाँ काम कर रहा है स्क्रिप्ट का प्रदर्शन विधि 2:

#!/usr/bin/expect -f 
# 
# start a process and background it after it reaches a certain stage 
# 
spawn perl -e "\$SIG{HUP} = 'IGNORE'; for (\$a='A';; \$a++) {print qq/value is \$a\\n/; sleep 1;}" 

set timeout 600 

# Detailed log so we can debug (uncomment to enable) 
# exp_internal -f /tmp/expect.log 0 

# wait till the subprocess gets to "G" 
expect -ex "value is G" 

send_user "\n>>> expect: got G\n" 

# when we get to G, background the process 
expect_background 

send_user ">>> spawned process backgrounding successful\n" 
exit 0 

यहाँ एक रन है निंग उदाहरण:

$ ./expect-bg 
spawn perl -e $SIG{HUP} = 'IGNORE'; for ($a='A';; $a++) {print qq/value is $a\n/; sleep 1;} 
value is A 
value is B 
value is C 
value is D 
value is E 
value is F 
value is G 

>>> expect: got G 
>>> spawned process backgrounding successful 

और पीएस आउटपुट में अपेक्षित होने के कारण, पर्ल प्रक्रिया पृष्ठभूमि और जीवित है।

USER  PID %CPU %MEM VSZ RSS TTY  STAT START TIME COMMAND 
hankm  6700 0.0 0.0 17696 2984 ?  Ss 18:49 0:00 perl -e $SIG{HUP} = 'IGNORE'; for ($a='A';; $a++) {print qq/value is $a\n/; sleep 1;} 
+0

बिल्कुल सही, इसका उल्लेख करने के लिए धन्यवाद! –

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