2009-10-27 13 views
20

को अलग करें, मैं वर्तमान में रिमोट मशीन में एसएसएच करने और स्क्रिप्ट चलाने की कोशिश कर रहा हूं, फिर नोड को स्क्रिप्ट चलाने के साथ छोड़ दें। नीचे मेरी लिपि है। हालांकि, जब यह चलता है, तो स्क्रिप्ट सफलतापूर्वक मशीन पर चलती है लेकिन एसएसएच सत्र लटकता है। समस्या क्या है?एसएसएच का उपयोग करके पृष्ठभूमि में कमांड कैसे चलाएं और सत्र

ssh -x [email protected]$node 'rm -rf statuslist 
         mkdir statuslist 
         chmod u+x ~/monitor/concat.sh 
         chmod u+x ~/monitor/script.sh 
         nohup ./monitor/concat.sh & 
         exit;' 

उत्तर

24

कुछ स्थितियां हैं जब आप रिमोट मशीन/सर्वर (जो स्वचालित रूप से समाप्त हो जाएंगी) पर कुछ स्क्रिप्ट निष्पादित/प्रारंभ करना चाहते हैं और सर्वर से डिस्कनेक्ट करते हैं।

उदाहरण के लिए: एक स्क्रिप्ट एक बॉक्स है जो जब

  1. निष्पादित पर चल रहे एक मॉडल और एक दूरस्थ सर्वर
  2. को प्रतियां लेता मॉडल के साथ एक सिमुलेशन चलाने के लिए एक स्क्रिप्ट बनाता है और सर्वर
  3. को धक्का
  4. सर्वर पर स्क्रिप्ट शुरू करता है और
  5. इस प्रकार स्क्रिप्ट का कर्तव्य सर्वर में सिमुलेशन चलाने के लिए शुरू होता है और एक बार पूरा हो जाता है (पूरा होने में दिन लग जाएंगे) परिणामों को क्लाइंट पर वापस कॉपी करें।

मैं निम्न आदेश का उपयोग होगा:

ssh remoteserver 'nohup /path/to/script `</dev/null` >nohup.out 2>&1 &' 

@CKeven, तो आप एक स्क्रिप्ट पर उन सभी आदेशों डाल सकता है, दूरस्थ सर्वर से धक्का और यह आरंभ इस प्रकार है:

echo '#!/bin/bash 
rm -rf statuslist 
mkdir statuslist 
chmod u+x ~/monitor/concat.sh 
chmod u+x ~/monitor/script.sh 
nohup ./monitor/concat.sh & 
' > script.sh 

chmod u+x script.sh 

rsync -azvp script.sh remotehost:/tmp 

ssh remotehost '/tmp/script.sh `</dev/null` >nohup.out 2>&1 &' 

आशा इस काम करता है ;-)

संपादित करें: तुम भी उपयोग कर सकते हैं ssh user @ host 'रोड़ी n एस sessionname -d -m "/ path// निष्पादन करने के लिए" '

जो एक अलग स्क्रीन सत्र बनाता है और भीतर यह

+0

क्या होगा यदि आपके द्वारा चलाए जा रहे आदेश को फ़ाइल से इनपुट की आवश्यकता है (जैसे एक बड़ा डीबी आयात, जैसे mysql cayblood

4

यह मानक इनपुट स्ट्रीम हो सकता है। ssh -n ... या ssh -f ... आज़माएं।

+0

अच्छा लगा। धन्यवाद। ' ssh -f "उपयोगकर्ता @ होस्ट DISPLAY = myhost: 0.0 qtcreator &" ' – kyb

21

इसके लिए screen का उपयोग करने के बारे में आप क्या सोचते हैं? आप कमांड (concat.sh) शुरू करने के लिए एसएसएच के माध्यम से screen चला सकते हैं और फिर यदि आप इसे मॉनीटर करना चाहते हैं तो आप स्क्रीन सत्र पर वापस लौट सकेंगे (आसान हो सकता है, जो कि कंसल्ट करता है)।

अधिक विशिष्ट हो, यह प्रयास करें:

ssh -t [email protected]$node screen -dm -S testing ./monitor/concat.sh 

आपको लगता है कि शीघ्र रिटर्न तुरंत, और कहा कि concat.sh रिमोट मशीन पर चल रहा है खोजना चाहिए। मैं कुछ विकल्पों की व्याख्या करूंगा:

  • ssh -t एक टीटीवी बनाता है। स्क्रीन की जरूरत है।
  • screen -dm इसे "अलग" मोड में शुरू करता है। यह आपके उद्देश्यों के लिए "पृष्ठभूमि" की तरह है।
  • -S परीक्षण आपके स्क्रीन सत्र को एक नाम देता है। यह वैकल्पिक है लेकिन अनुशंसित है।

अब, एक बार ऐसा करने के बाद, आप रिमोट मशीन पर जाकर यह चला सकते हैं:

screen -r testing 

इस स्क्रीन सत्र जो अपने कार्यक्रम में शामिल करने के लिए आप जोड़ देती है। वहां से आप इसे नियंत्रित कर सकते हैं, इसे मार सकते हैं, इसका आउटपुट देख सकते हैं, और इसी तरह। Ctrl-A, फिर डी आपको स्क्रीन सत्र से अलग कर देगा। screen -ls सभी चल रहे सत्रों की सूची देगा।

+0

क्या आपको यह स्पष्ट रूप से यह बताना है कि यह कैसे करें? –

+2

@ जॉन ज़विनक, क्या यह निश्चित रूप से आपके लिए काम करता है? निम्नलिखित कमांड डी ओएस मेरे लिए काम नहीं करते हैं: एसएसटी-एचओएसटी "स्क्रीन-डीएम-एस नींद नींद 10"। यह बस कहता है "कनेक्शन बंद हो गया है" और जब मैं सर्वर में लॉगिन करता हूं तो कोई अलग स्क्रीन नहीं होती है। – richardkmiller

+4

@richardkmiller: जब मैंने इसे आजमाया तो मुझे वही (बुरा) परिणाम मिला जो आपने किया था। मैंने '-t' विकल्प को एसएसएच में' -f' के रूप में बदल दिया है, ताकि यह कमांड को पृष्ठभूमि (और टीटीई आवंटित नहीं करता), और फिर यह काम करता है। मुझे लगता है कि लिनक्स के हस्तक्षेप 2+ वर्षों में कुछ बदल गया है क्योंकि मैंने यह जवाब लिखा था ... 'ssh -f HOST "स्क्रीन-डीएम-एस नींद नींद 10" कोशिश करें और आप इसे अब काम कर सकते हैं। –

0

मेरे लिए लक्ष्य आदेश चलाता है, केवल इस काम किया:

screen -dmS name sh my-script.sh 

यह, ज़ाहिर है, स्क्रीन पर निर्भर करता है, और यदि आप कभी भी stdin या stdout चाहते हैं, तो आप बाद में संलग्न कर सकते हैं। मेरी-script.sh समाप्त होने पर स्क्रीन स्वयं समाप्त हो जाएगी।

0

नीचे एक अधिक सामान्य निर्णय है कि खोजने के लिए कुछ प्रयास की आवश्यकता है, और यह वास्तव में मेरे लिए काम करता है:

#!/usr/bin/bash 
theScreenSessionName="test" 
theTabNumber="1" 
theStuff="date; hostname; cd /usr/local; pwd; /usr/local/bin/top" 

echo "this is a test" 

ssh -f [email protected] "/usr/local/bin/screen -x $theScreenSessionName -p $theTabNumber -X stuff \" 
$theStuff 
\"" 

यह टैब स्क्रीन सत्र $ का कोई $ theTabNumber के आदेशों की $ theStuff सूची भेजता है 'user' की तरफ से 'सर्वर' पर प्रारंभिक रूप से बनाया गयाSScreenSessionName।

कृपया बाद -X सामान \ " है कि एक 'सामान' विकल्प की गड़बड़ दूर करने के लिए भेज दिया जाता है एक पिछली श्वेत रिक्ति के बारे में पता होना। खाली स्थान के और $ अगली पंक्ति में theStuff 'Enter' से जोड़ दिए जाते हैं (^ एम) कीस्ट्रोक्स। उन्हें न जाने दें!

"यह एक परीक्षण" संदेश प्रारंभिक टर्मिनल में गूँजती है, और $ theStuff आदेशों वास्तव में उल्लेख किया स्क्रीन/टैब के अंदर क्रियान्वित कर रहे हैं।

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