आपका यह तर्क कि यह ssh
स्वयं है कि 255 निकास स्थिति लौटाता है, सही है। ssh
आदमी पेज कि राज्यों:
ssh दूरस्थ कमांड के बाहर निकलने की स्थिति के साथ या 255 के साथ बाहर निकलता है यदि कोई त्रुटि हुई।
यदि आप केवल चलाने के लिए थे ssh pi@10.20.0.10 "pkill -f asdf"
, तो आपको " कोई प्रक्रिया नहीं मिली " 1
की pkill
स्थिति के अनुसार , आपको सबसे अधिक बाहर निकलने की स्थिति मिलेगी ।
चुनौतीपूर्ण भाग यह समझना है कि जब आप चलाते हैं तो SSH के साथ कोई त्रुटि क्यों होती है
ssh pi@10.20.0.10 "pkill -f asdf || true"
SSH रिमोट कमांड
SSH सर्वर रिमोट कमांड चलाने के लिए एक शेल लॉन्च करता है। यहाँ इस कार्रवाई में एक उदाहरण है:
$ ssh server "ps -elf | tail -5"
4 S root 35323 1024 12 80 0 - 43170 poll_s 12:01 ? 00:00:00 sshd: anthony [priv]
5 S anthony 35329 35323 0 80 0 - 43170 poll_s 12:01 ? 00:00:00 sshd: anthony@notty
0 S anthony 35330 35329 0 80 0 - 28283 do_wai 12:01 ? 00:00:00 bash -c ps -elf | tail -5
0 R anthony 35341 35330 0 80 0 - 40340 - 12:01 ? 00:00:00 ps -elf
0 S anthony 35342 35330 0 80 0 - 26985 pipe_w 12:01 ? 00:00:00 tail -5
ध्यान दें कि डिफ़ॉल्ट शेल है bash
और यह कि रिमोट कमांड एक साधारण कमांड नहीं है , लेकिन एक पाइपलाइन है , "कंट्रोल ऑपरेटर द्वारा अलग किए गए एक या अधिक कमांड का एक क्रम |
"।
बैश शेल यह महसूस करने के लिए पर्याप्त चतुर है कि यदि -c
विकल्प द्वारा इसे पारित किया जा रहा है , तो यह एक साधारण कमांड है , यह वास्तव में नई प्रक्रिया के लिए मजबूर न करके अनुकूलन कर सकता है, अर्थात, यह सीधे exec
अतिरिक्त चरण के माध्यम से जाने के बजाय सरल कमांड का उपयोग करता है। की fork
ing इससे पहले कि यह exec
है। जब आप दूरस्थ सरल कमांड चलाते हैं ( ps -elf
इस मामले में) क्या होता है, इसका एक उदाहरण यहां दिया गया है :
$ ssh server "ps -elf" | tail -5
1 S root 34740 2 0 80 0 - 0 worker 11:49 ? 00:00:00 [kworker/0:1]
1 S root 34762 2 0 80 0 - 0 worker 11:50 ? 00:00:00 [kworker/0:3]
4 S root 34824 1024 31 80 0 - 43170 poll_s 11:51 ? 00:00:00 sshd: anthony [priv]
5 S anthony 34829 34824 0 80 0 - 43170 poll_s 11:51 ? 00:00:00 sshd: anthony@notty
0 R anthony 34830 34829 0 80 0 - 40340 - 11:51 ? 00:00:00 ps -elf
मैं इस व्यवहार से पहले आया था, लेकिन मुझे इस AskUbuntu उत्तर के अलावा एक बेहतर संदर्भ नहीं मिला ।
pkill व्यवहार
चूंकि pkill -f asdf || true
एक साधारण कमांड नहीं है (यह एक कमांड लिस्ट है ), उपरोक्त अनुकूलन तब नहीं हो सकता है जब आप चलाते हैं ssh pi@10.20.0.10 "pkill -f asdf || true"
, sshd
प्रक्रिया कांटे और निष्पादित होती है bash -c "pkill -f asdf || true"
।
जैसा कि ctx का उत्तर बताता है, pkill
अपनी प्रक्रिया को नहीं मारेगा। हालांकि, यह किसी भी अन्य प्रक्रिया को मार देगा जिसकी कमांड लाइन -f
पैटर्न से मेल खाती है । bash -c
अपने स्वयं के माता पिता (के रूप में यह होता है) - तो यह इस प्रक्रिया को मारता आदेश इस पैटर्न से मेल खाता है।
SSH सर्वर तब देखता है कि दूरस्थ कमांड को चलाने के लिए शुरू की गई शेल प्रक्रिया अप्रत्याशित रूप से मार दी गई थी, इसलिए यह SSH क्लाइंट को एक त्रुटि की सूचना देता है।
pkill
क्योंकि इसके आर्ग सूची regexp से मेल खाता अपनी मूल खोल प्रक्रिया को मारता है, मैं एक शब्दावली आपत्ति बढ़ा देंगे:x || y
है नहीं एक यौगिक आदेश है, यह एक है आदेश सूची ।