SSH का उपयोग दूरस्थ रूप से एक प्रक्रिया शुरू करने के लिए


18

मैंने एक स्क्रिप्ट लिखी है जिसे मैं अपने नियंत्रण में कई मशीनों के लिए एक नई सेवा को धक्का देने और तैनात करने के लिए उपयोग कर रहा हूं, और प्रक्रिया को निष्पादित करने के लिए मैं ssh का उपयोग दूरस्थ रूप से प्रक्रिया शुरू करने के लिए कर रहा हूं। दुर्भाग्य से, जब भी मैं प्रक्रिया शुरू करने के लिए SSH का उपयोग करता हूं, SSH कमांड कभी वापस नहीं आती है, जिससे स्क्रिप्ट रुक जाती है।

कमांड के रूप में निर्दिष्ट किया गया है: ssh $ उपयोगकर्ता @ $ होस्ट "/ रूट / कमांड और"। जब भी मैं सरल कमांड चलाता हूं, जैसे कि ps या जो, SSH कमांड तुरंत लौटता है, हालांकि जब मैं कोशिश करता हूं और अपनी प्रक्रिया शुरू करता हूं तो यह वापस नहीं आता है। मैंने अपनी प्रक्रिया को एक साधारण बैश स्क्रिप्ट में लपेटने की कोशिश की है, जो प्रक्रिया शुरू करता है और फिर बाहर निकलता है, हालांकि यह SSH कमांड को भी लटका देता है (भले ही bash स्क्रिप्ट सफलता का संदेश देता है, और सामान्य रूप से बाहर निकलता है)।

क्या किसी के पास इस व्यवहार के कारण के बारे में कोई अंतर्दृष्टि है, और प्रक्रिया शुरू होते ही मुझे वापस लौटने के लिए SSH कमांड कैसे मिल सकती है?

आपकी अंतर्दृष्टि के लिए धन्यवाद!


उस सटीक कमांड लाइन को पोस्ट करें जिसका आप उपयोग कर रहे हैं ... omit पासवर्ड / यूजरनेम / आईपी
जोसेफ केर्न

ssh $ SSH_USER @ $ HOST_ADDR "/ रूट / AppName और"
rmrobins

मुझे यह उल्लेख करना चाहिए कि मैंने एसएसएच कुंजी स्थापित की है, इसलिए रिमोट सिस्टम पर कमांड चलाने के लिए पासवर्ड का उपयोग करना आवश्यक नहीं है।
rmrobins

@rmrobins, एक बहुत अच्छा कदम - सार्वजनिक कुंजी को स्थापित करना।
निक

जवाबों:


28

SSH रिमोट शेल के स्टडिन, स्टडआउट और स्टेडर को आपके स्थानीय टर्मिनल से जोड़ता है, इसलिए आप रिमोट पर चलने वाले कमांड के साथ बातचीत कर सकते हैं।

साइड इफेक्ट के रूप में, यह तब तक चलता रहेगा जब तक कि ये कनेक्शन बंद नहीं हो जाते, जो तब होता है, जब रिमोट कमांड और उसके सभी बच्चे (!) समाप्त हो चुके होते हैं (क्योंकि बच्चे, जो कि "&" शुरू होता है, विरासत एसटीडी * उनके पास से * मूल प्रक्रिया और इसे खुला रखना)।

इसलिए आपको कुछ का उपयोग करने की आवश्यकता है

ssh user@host "/script/to/run < /dev/null > /tmp/mylogfile 2>&1 &"

<,> और 2> & 1 रीडायरेक्ट स्टड / stdout / stderr आपके टर्मिनल से दूर। "&" तब आपकी स्क्रिप्ट पृष्ठभूमि पर जाती है। उत्पादन में आप निश्चित रूप से एक उपयुक्त लॉगफाइल के लिए स्टड / इरेडिट पुनर्निर्देशित करेंगे।

देख

http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html

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

बस यह पता चला है कि < /dev/nullउपरोक्त आवश्यक नहीं है (लेकिन stdout / इरेट को पुनर्निर्देशित करना ) है। पता नहीं क्यों ...


धन्यवाद, यह वही है जो मैं देख रहा था - यह मेरे लिए नहीं हुआ था कि इस प्रक्रिया को एसटीडी * विरासत में मिलेगा, यहां तक ​​कि उपयोग करते समय और इसे पृष्ठभूमि में लॉन्च करने के लिए।
15

+1! मेरे लिये कार्य करता है। और आप लॉग फाइल को गूंज कर आउटपुट भी प्रिंट कर सकते हैं: ssh user@host "/script/to/run > /tmp/ssh.stdout 2>&1 && cat /tmp/ssh.stdout && rm -f /tmp/ssh.stdout"
फिशरडाउन

5

आप nohup की कोशिश कर सकते हैं । अधिक जानकारी के लिए मैन नोह।

ssh host "nohup script &"

यदि आप आउटपुट को रिमोट मशीन पर रखना चाहते हैं, तो यहां एक वेरिएंट है

ssh user@host 'export REMOTE=myname; nice nohup ./my-restart >
logfile.log 2>&1 &'

5

एक अन्य विकल्प एक अलग screen(1), कुछ इस तरह से आग लगाना होगा :

ssh -l user host "screen -d -m mycommand"

यह एक अलग स्क्रीन शुरू करेगा (जो इसके अंदर सभी इंटरैक्शन को पकड़ता है) और फिर तुरंत ssh सत्र को समाप्त करते हुए वापस आ जाता है।

थोड़ी अधिक सरलता के साथ, आप इस तरह से काफी जटिल रिमोट कमांड कॉल को हल कर सकते हैं।


4
 -f      Requests ssh to go to background just before command execution.
         This is useful if ssh is going to ask for passwords or
         passphrases, but the user wants it in the background.  This
         implies -n.  The recommended way to start X11 programs at a
         remote site is with something like ssh -f host xterm.

         If the ExitOnForwardFailure configuration option is set to “yes”,
         then a client started with -f will wait for all remote port for‐
         wards to be successfully established before placing itself in the
         background.

1
इस विधि के साथ मुद्दा यह है कि एसएसएच कमांड वास्तव में समाप्त नहीं हुई है, यह केवल पृष्ठभूमि में छिपी हुई है, इसलिए स्क्रिप्ट चलाने वाले होस्ट की पृष्ठभूमि में बड़ी संख्या में एसएसएच कमांड होंगे जो कभी वापस नहीं आते क्योंकि एसएसएच कमांड कभी वापस नहीं आते हैं () यानी मूल समस्या जिसे मैं हल करना चाहता हूं)
rmrobins

-1

मुझे लगता है कि सही तरीका होगा

ssh user@host exec script.sh &

नहीं, यह मेरे लिए काम नहीं करता है। क्यों करना चाहिए?
सलेके

मैंने ssh पर बैकग्राउंड पुश का उपयोग नहीं किया है, हाथ पर एक शब्द के बिना कोशिश कर रहा था। मेरी गलती।
निक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.