bash - लक्ष्य मशीन पर पृष्ठभूमि में कमांड निष्पादित करने के लिए ssh प्राप्त करना




csh (8)

एफडी की रीडायरेक्ट करें

आउटपुट को &>/dev/null साथ पुनर्निर्देशित करने की आवश्यकता है जो stderr और stdout दोनों &>/dev/null को रीडायरेक्ट करता है और >/dev/null 2>/dev/null या >/dev/null 2>&1 का समानार्थी है।

parantheses

sh -c '( ( command ) & )' का उपयोग करने का सबसे अच्छा तरीका है sh -c '( ( command ) & )' जहां कमांड कुछ भी है।

ssh askapache 'sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'

नोहप शैल

आप शेल लॉन्च करने के लिए सीधे नोहप का उपयोग भी कर सकते हैं:

ssh askapache 'nohup sh -c "( ( chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'

अच्छा लॉन्च

एक और चाल कमांड / खोल लॉन्च करने के लिए अच्छा उपयोग करना है:

ssh askapache 'nice -n 19 sh -c "( ( nohup chown -R ask:ask /www/askapache.com &>/dev/null ) & )"'

यह एक अनुवर्ती प्रश्न है कि आप शैल स्क्रिप्ट में एसएसएच का उपयोग कैसे करते हैं? सवाल। अगर मैं उस मशीन पर पृष्ठभूमि में चलने वाली रिमोट मशीन पर कमांड निष्पादित करना चाहता हूं, तो मैं ssh कमांड को वापस कैसे प्राप्त करूं? जब मैं कमांड के अंत में एम्पर्सेंड (&) को शामिल करने का प्रयास करता हूं तो यह बस लटकता है। कमांड का सटीक रूप इस तरह दिखता है:

ssh [email protected] "cd /some/directory; program-to-execute &"

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


'At' कमांड का उपयोग करना सबसे तेज़ और आसान तरीका है:

एसएसएच उपयोगकर्ता @ लक्ष्य "अब -f /home/foo.sh"


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

पृष्ठभूमि की नौकरियों को नूपिंग करना उदाहरण के लिए उपयोगी है जब एसएसएच के माध्यम से लॉग इन किया जाता है, क्योंकि पृष्ठभूमि की नौकरियां दौड़ की स्थिति [2] के कारण लॉगआउट पर खोलने का कारण बन सकती हैं। इस समस्या को सभी तीन I / O धाराओं को पुनर्निर्देशित करके भी दूर किया जा सकता है:

nohup myprogram > foo.out 2> foo.err < /dev/null &

मुझे लगता है कि आपको जो कुछ चाहिए वो प्राप्त करने के लिए आपको इन उत्तरों में से कुछ को जोड़ना होगा। यदि आप सेमीकॉलन के साथ संयोजन में नोहप का उपयोग करते हैं, और पूरी चीज उद्धरणों में लपेटते हैं, तो आपको मिलता है:

ssh [email protected] "cd /some/directory; nohup myprogram > foo.out 2> foo.err < /dev/null"

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

ssh [email protected] "cd /some/directory; nohup myprogram > /dev/null 2>&1"

सभी आउटपुट को / dev / null पर रीडायरेक्ट करने के लिए।


मैं वही काम करने की कोशिश कर रहा था, लेकिन अतिरिक्त जटिलता के साथ कि मैं इसे जावा से करने की कोशिश कर रहा था। तो जावा चलने वाली एक मशीन पर, मैं पृष्ठभूमि में (नोहप के साथ) किसी अन्य मशीन पर एक स्क्रिप्ट चलाने की कोशिश कर रहा था।

कमांड लाइन से, यहां क्या काम किया गया है: (यदि आपको मेजबान को एसएसएच करने की आवश्यकता नहीं है तो आपको "-i keyFile" की आवश्यकता नहीं हो सकती है)

ssh -i keyFile [email protected] bash -c "\"nohup ./script arg1 arg2 > output.txt 2>&1 &\""

ध्यान दें कि मेरी कमांड लाइन में, "-c" के बाद एक तर्क है, जो सभी उद्धरणों में है। लेकिन इसके लिए दूसरे छोर पर काम करने के लिए, इसे अभी भी उद्धरणों की आवश्यकता है, इसलिए मुझे इसके अंदर से बच निकलना पड़ा।

जावा से, यहां क्या काम किया गया है:

ProcessBuilder b = new ProcessBuilder("ssh", "-i", "keyFile", "bash", "-c",
 "\"nohup ./script arg1 arg2 > output.txt 2>&1 &\"");
Process process = b.start();
// then read from process.getInputStream() and close it.

यह काम करने के लिए थोड़ा सा परीक्षण और त्रुटि हुई, लेकिन ऐसा लगता है कि अब अच्छा काम करता है।


मैं सिर्फ एक कामकाजी उदाहरण दिखाना चाहता था जिसे आप काट और पेस्ट कर सकते हैं:

ssh REMOTE "sh -c \"(nohup sleep 30; touch nohup-exit) > /dev/null &\""

यह मेरे लिए ऐसा करने का सबसे साफ तरीका रहा है: -

ssh -n -f [email protected] "sh -c 'cd /whereever; nohup ./whatever > /dev/null 2>&1 &'"

इसके बाद चलने वाली एकमात्र चीज रिमोट मशीन पर वास्तविक कमांड है


यह मेरे लिए काम कर सकता है कई बार:

ssh -x remoteServer "cd yourRemoteDir; ./yourRemoteScript.sh </dev/null >/dev/null 2>&1 & " 




csh