ssh

2012-09-28 18 views
8

के माध्यम से नोहप के साथ शुरू की गई प्रक्रिया का पीआईडी ​​प्राप्त करें मैं एसएसएच के माध्यम से रिमोट मशीन पर नोहप का उपयोग कर प्रक्रिया शुरू करना चाहता हूं। समस्या यह है कि प्रक्रिया के पीआईडी ​​को नोहप के साथ कैसे शुरू किया जाए, इसलिए "प्रक्रिया वास्तव में कुछ कर रही है", कुछ बाहरी खोल उदाहरण या जैसी नहीं। इसके अलावा, मैं फ़ाइलों में stdout और stderr संग्रहीत करना चाहते हैं, लेकिन वह नहीं यहां मुद्दा यह हैssh

स्थानीय स्तर पर, यह दोषरहित

nohup sleep 30 > out 2> err < /dev/null & echo $! 

का उपयोग कर काम करता है है ... यह मेरे आदेश का सही पीआईडी ​​गूंज रहा है " नींद 30 ", जिसे मैं" टॉप "या" पीएस ऑक्स | grep नींद "का उपयोग करके भी देख सकता हूं।

लेकिन मुझे इसे एसएसएच के माध्यम से दूरस्थ रूप से करने में परेशानी हो रही है। मैंने

ssh remote_machine 'nohup bash -c "((sleep 30) &)" > out 2> err < /dev/null' 

पर कुछ कोशिश की लेकिन मुझे यह पता नहीं लगाया जा सकता कि "echo $!" कहां रखा जाए! ताकि यह मेरे स्थानीय खोल में प्रदर्शित हो। यह हमेशा मुझे गलत पीआईडी ​​दिखा रहा है, उदाहरण के लिए "बैश" इंस्टेंस इत्यादि में से एक

क्या किसी को यह हल करने का विचार है?

संपादित करें: ठीक है, "bash -c" की आवश्यकता नहीं हो सकती है। जैसा Lotharyx ने कहा, मैं सही पीआईडी ​​ठीक

ssh remote 'nohup sleep 30 > out 2> err < /dev/null & echo $!' 

लेकिन फिर समस्या यह है कि अगर आप कुछ है कि पैदा करता है के साथ "नींद 30" स्थानापन्न उत्पादन, जैसे कि, "नमस्ते विश्व गूंज!", कि उत्पादन का उपयोग कर पाने के फाइल "आउट" में नहीं, न तो स्थानीय पर और न ही दूरस्थ तरफ। किसी को भी एक विचार क्यों मिला?

EDIT2: मेरी गलती! अन्य डिवाइस पर बस कोई जगह नहीं छोड़ी गई, यही कारण है कि फाइलें "बाहर" और "गलती" खाली रह गईं!

तो यह काम कर रहा है। इसके अलावा, यदि एक लगातार एक से अधिक आदेशों कॉल करने के लिए, अर्धविराम द्वारा अलग करना चाहता है (;), एक अभी भी बहुत की तरह उपयोग कर सकते हैं "बैश -c",:

ssh remote 'nohup bash -c "echo bla;sleep 30;echo blupp" > out 2> err < /dev/null & echo $!' 

तो यह की पीआईडी ​​बाहर प्रिंट स्थानीय पक्ष पर "bash -c", जो ठीक है। ("Innermost" या "व्यस्त" प्रक्रिया के पीआईडी ​​को प्राप्त करना असंभव है, क्योंकि प्रत्येक प्रोग्राम स्वयं नए उपप्रवाहों को जन्म दे सकता है, पता लगाने का कोई तरीका नहीं है ...)

उत्तर

8

मैंने निम्नलिखित (स्थानीय मशीन डेबियन है, रिमोट मशीन CentOS है), और यह वास्तव में काम किया के रूप में मुझे लगता है कि आप उम्मीद कर रहे हैं:

 
    ~# ssh [email protected] 'nohup sleep 30 > out 2> err < /dev/null & echo $!' 
    [email protected]'s password: 
    14193 
    ~# 

रिमोट मशीन पर, मैं ps -E था, और इस लाइन देखा:

 
    14193 ?  00:00:00 sleep 

तो, स्पष्ट रूप से, मेरी स्थानीय मशीन पर, आउटपुट दूरस्थ मशीन पर "नींद" निष्पादन का पीआईडी ​​है।

एसएसएच सुरंग में भेजते समय आप अपने आदेश में बैश क्यों जोड़ रहे हैं?

+0

हम्म, आप सही हैं, लेकिन अभी भी stdout के साथ एक मुद्दा प्रतीत होता है। उदाहरण के लिए, यदि मैं आउटपुट का उत्पादन करने वाली किसी चीज़ के साथ "नींद 30" को प्रतिस्थापित करता हूं, जैसे "इको हैलो वर्ल्ड!", यह फ़ाइल "आउट" में समाप्त नहीं होता है, लेकिन पीआईडी ​​की तरह मुझे वापस लौटा दिया जाता है। –

+0

मुझे लगता है कि मैंने "bash -c" जोड़ा क्योंकि मैं पंक्ति में एकाधिक कमांड निष्पादित करना चाहता था, जैसे "echo foo; sleep 30; echo bar"। –

+0

मेरी गलती, आपका समाधान बिल्कुल काम कर रहा है! –