2012-03-29 10 views
7

पर पृष्ठभूमि को रोकता है यह पता लगाने के बाद कि एक कैपिस्ट्रानो कार्य (जिसने पृष्ठभूमि में एक डिमन शुरू करने का प्रयास किया) क्यों लटका था, मैंने पाया कि एसएसएच पर बैश में && का उपयोग करने से बाद के कार्यक्रम में चलने से रोकता है पृष्ठभूमि। मैंने इसे 4.1.5 और 4.2.20 पर बैश करने की कोशिश की।bash && ऑपरेटर ssh

निम्नलिखित बैश में (यानी sleep समाप्त होने की प्रतीक्षा) रखती हूँ:

ssh localhost "cd /tmp && nohup sleep 10 >/dev/null 2>&1 &" 

निम्नलिखित कार्य नहीं करेंगे:

ssh localhost "cd /tmp ; nohup sleep 10 >/dev/null 2>&1 &" 

न तो होगा यह:

cd /tmp && nohup sleep 10 >/dev/null 2>&1 & 

&& पर ध्यान दिए बिना, zsh और डैश दोनों पृष्ठभूमि में इसे पृष्ठभूमि में निष्पादित करेंगे और एसएसएच क्या यह सामान्य/अपेक्षित व्यवहार है, या बग के लिए?

+1

मैं ठीक अपने प्रश्न का उत्तर नहीं पता है, लेकिन होगा कहें कि रिमोट एंड पर बैश के साथ, एसएसएच का उपयोग करते समय मुझे कभी-कभी समान परेशानियों का सामना करना पड़ता है। मुझे नहीं पता कि समस्या बैश-विशिष्ट है, लेकिन मैंने कभी-कभी 'नोहुप' कमांड के बजाय बैश शैल के 'अस्वीकार' बिल्टिन का उपयोग करके बेहतर भाग्य प्राप्त किया है। यदि यह आपकी रूचि रखते हैं, तो 'अस्वीकार मदद करें' टाइप करें बैश चलाने के दौरान कम '। और यदि आप एक सामान्य समाधान के बारे में सीखना चाहते हैं, तो कृपया इसे यहां पोस्ट करें। मुझे पढ़ने में रुचि होनी चाहिए। – thb

+0

मैंने वास्तव में 'अस्वीकार', 'नोहुप' और पुनर्निर्देशन के विभिन्न संयोजनों के बारे में किसी भी लाभ के बारे में बात करने की कोशिश नहीं की। '&&' हमेशा अवरुद्ध पृष्ठभूमि। मैं सब कमांड में दो कमांड लपेटने से दूर हो सकता था, लेकिन यह वास्तव में एक ही बात नहीं है। – Hinrik

+0

आदेश मेरे लिए काम करता है। हैंग्स से आपका क्या मतलब है? क्या 'सीडी' काफी समय लगता है? यह रिमोट सर्वर के साथ एक मुद्दा हो सकता है, उदा। बहुत अधिक भार – suvayu

उत्तर

4

एक आसान समाधान का उपयोग करने के लिए है:

ssh localhost "(cd /tmp && nohup sleep 10) >/dev/null 2>&1 &" 

(यह भी काम करता है अगर आप ब्रेसेस का उपयोग करें, नीचे दिए गए दूसरे उदाहरण देखें)।

मैंने आगे प्रयोग नहीं किया लेकिन मुझे उचित रूप से आश्वस्त है कि इसे खुले फ़ाइल डिस्क्रिप्टरों के साथ लटकना है। शायद zsh और पानी का छींटा && बाँध तो इसका मतलब है कि यह है कि क्या के रूप में वर्तनी किया जाना है:

{ cd /tmp && nohup sleep 10; } >/dev/null 2>&1 
बैश में


नहीं, डैश में त्वरित प्रयोग से पता चलता है कि echo foo && echo bar >file केवल बाद वाले को रीडायरेक्ट करता है। फिर भी, इसे अधिक उत्पादन के लिए प्रतीक्षा करने के लिए खुले एफडी के कारण एसएसएच के साथ कुछ करना है; मैंने अतीत में बहुत कुछ चलाया है।
एक और चाल, यदि आप इस विशेष मामले के लिए कोष्ठक या ब्रेसिज़ का उपयोग करते हैं तो आवश्यक नहीं है, लेकिन अधिक सामान्य संदर्भ में उपयोगी हो सकता है, जहां && के साथ आदेशों का सेट अधिक जटिल है। चूंकि बैश फ़ाइल डिस्क्रिप्टर को && के साथ अनुपयुक्त रूप से लटक रहा है, लेकिन ; के साथ नहीं, तो आप a && b && c a || exit 1; b || exit 1; c पर बदल सकते हैं। इस परीक्षण का मामला साथ काम करता है:

ssh localhost "true || exit 1; echo going on; nohup sleep 10 >/dev/null 2>&1 &" 

बदलें false साथ true और "चल रहा" छोड़ दिया जाता है गूंज।

(तुम भी set -e कर सकते हैं, हालांकि कभी-कभी लगता है कि एक बड़ा हथौड़ा वांछित से अधिक है।)

+0

हाँ, '&&' के साथ '|| को बदल दिया गया बाहर निकलें 1; 'निश्चित रूप से उपयोग करने के लिए कामकाज है। – Hinrik

1

यह काम करने के लिए लगता है:

ssh localhost "(exec 0>&- ; exec 1>&-; exec 2>&-; cd /tmp; sleep 20&)" 
+1

सभी डिस्क्रिप्टरों को सामने बंद करने की कमी यह है कि आप त्रुटि संदेशों को मूल ('ssh') होस्ट पर वापस नहीं निकाल सकते हैं। – torek