जब ssh की मृत्यु हो जाए तो ssh द्वारा मार दी गई प्रक्रिया


23

यह एक ऐसा सवाल है जिसे कई बार संबोधित किया गया है, न केवल यहां, बल्कि स्टैक एक्सचेंज नेटवर्क की अन्य साइटों में भी (जैसे कि मैं ssh को बाधित करने पर दूरस्थ प्रक्रिया को मारने के लिए ssh कैसे बनाऊं? )। हालाँकि, मैं मेरे लिए कोई भी समाधान काम नहीं कर सकता।

मैं ssh के माध्यम से एक कमांड चला रहा हूं। जब भी मैं ssh से बाहर निकलता हूं, मैं चाहता हूं कि कमांड भी मर जाए। यह कमांड एक डेमॉन है, जिसे ktserver कहा जाता है, जो कि Ctrl-C दबाने तक अनिश्चित काल तक चलता है।

मैं इसे निम्नानुसार चलाता हूं: ssh -t compute-0-1 ktserverऔर, वास्तव में, जब मैं Ctrl-C दबाता हूं, तो प्रक्रिया इनायत से समाप्त होती है और ssh सत्र समाप्त होता है।

हालाँकि, अगर Ctrl-C दबाने के बजाय, मैं killकमांड का उपयोग करके ssh प्रक्रिया को मारता हूं (उदाहरण के लिए, SIGINT या SIGHUP को भेजना), तो यह ktserverप्रक्रिया जीवित रहती है।

मैं ktserverकैसे sshमारा जा सकता है पर हमेशा मर स्वतंत्र बना सकते हैं ?

संपादित करें : यदि, इसके बजाय, ktserverमैं कुछ पूरी तरह से अलग चलाता हूं, जैसे gedit, सब कुछ एक आकर्षण की तरह काम करता है (यानी जब कनेक्शन मर जाता है)। इसलिए, प्रक्रिया में ही कुछ गड़बड़ हो सकती है। उदाहरण के लिए, मैंने सोचा कि यह SIGHUP या SIGINT की अनदेखी कर सकता है। हालांकि, जब मैं दौड़ता हूं kill -1 ktserverया kill -2 ktserver, प्रक्रिया उम्मीद के मुताबिक मर जाती है।

EDIT2 : जैसा कि मार्क प्लॉटनिक बताते हैं, मुद्दा इस तथ्य से संबंधित है कि ssh चैनल पर कोई संचार प्रसारित नहीं होता है। मैंने ssh -t <host> readssh प्रक्रिया को बाद में चलाने और मारने की पुष्टि की है । readअभी भी जीवित था और लात मार रहा था।


क्या आपने कोशिश की है kill -9 ktserver?

@HermanTorjussen ज़रूर, जो काम करता है। समस्या यह है कि यह आदेश एक अन्य प्रक्रिया के भीतर से चलाया जाता है और हो सकता है कि मेरी सभी प्रक्रियाओं पर मेरा नियंत्रण न हो, जिससे मेरी प्रक्रिया की मृत्यु हो सकती है, और इसलिए इसके साथ सत्र। इसलिए मुझे यह सुनिश्चित करने के लिए कुछ विश्वसनीय तरीके की आवश्यकता है कि जब भी मेरी प्रक्रिया-और इसलिए ssh- की मृत्यु हो जाती है, ktserver उनके साथ मर जाएगा।
जर्मनके

लिनक्स के साथ मेरा अनुभव यह है कि अगर रिमोट कमांड मृत tcp कनेक्शन के लिए कोई i / o नहीं करता है, तो यह चालू रहेगा। मेरे पास नेटवर्क के मुद्दों के कारण कनेक्शन के मरने के ssh example.com dd ...कुछ घंटे बाद तक नौकरियां चली sshगईं। यदि आप ktserverथोड़ी देर में एक बार कुछ आउटपुट करने के लिए विकल्प लेने के लिए बदल सकते हैं , तो यह एक वर्कअराउंड हो सकता है।
मार्क प्लॉटनिक

@MarkPlotnick वास्तव में, मैंने readदूरस्थ कंप्यूटर में चलने की कोशिश की है , और ssh कनेक्शन को मारने के बाद, readमर नहीं गया। दुर्भाग्य से, मैं कुछ भी उत्पादन करने के लिए ktserver नहीं बदल सकता। फिर कोई हल नहीं है?
जर्मनके

2
मैं मानता हूं कि जब ssh मर जाता है तो आपका खोल भी मर जाता है। जब यह समाप्त हो जाए तो आप सिग्नल -1 (SIGHUP) भेजने के लिए अपने शेल को कॉन्फ़िगर कर सकते हैं। ( shopt -s huponexit)। क्या आप परीक्षण कर सकते हैं यदि यह आपके लिए काम करता है?
हेन्नेस

जवाबों:


13

आमतौर पर जब ssh कनेक्शन मर जाता है तो शेल भी मर जाता है। जब आप अपने सभी बच्चों को समाप्त कर देते हैं, तो आप सिग्नल -1 (SIGHUP) भेजने के लिए अपने शेल को कॉन्फ़िगर कर सकते हैं।

बैश के लिए आप इस विकल्प को अंतर्निहित कमांड शॉप के माध्यम से कॉन्फ़िगर कर सकते हैं । ( shopt -s huponexit)।

Zsh के लिए आप चाहते हैं ।setoptHUP


मुझे लगा कि यह मेरी मौजूदा समस्या का जवाब है, लेकिन यह काम नहीं करता है। मैं भाग रहा हूँ: ssh $ host "scp लार्जफ़िले.डैट $ OtherHost: / tmp" & pid = $! और फिर उस हस्तांतरण को रोकने की कोशिश कर रहा है: shopt -s huponexit; $ पीड़ को मारना, लेकिन जब मैंने शुरू किया एसएच को मारता हूं तो स्कैप बंद नहीं होता है। कोई विचार?
डेविड डोरिया

क्या आप scp कमांड शुरू करने से पहले शेल विकल्पों के साथ परीक्षण कर सकते हैं ? या एक खोल शुरू करके, दुकान की स्थापना और एससीपी शुरू करना?
हेन्स

2
यह मेरे लिए काम करता है, लेकिन मुझे पहले यह सुनिश्चित करना था कि मैं उपयोग कर रहा हूं ssh -t -t, ( -tदो बार नोटिस !) जो केवल खट्टी के बजाय टिट आवंटन को मजबूर करता है।
निकोलस वू

13

मैंने पाया कि इसे काम -t -tकरने के लिए एक तर्क के रूप में इस्तेमाल कर रहा हूं ssh। मुझे huponexitमूल या दूरस्थ शेल के लिए सेट करने की आवश्यकता नहीं थी ।

मैंने इसका परीक्षण इस प्रकार किया है:

काम नहीं करता है:

ssh user@remote sleep 100
^C

इसने ssh सत्र को मार दिया, लेकिन मैं देख सकता हूं कि नींद की प्रक्रिया अभी भी रिमोट होस्ट पर चल रही है ( ps -ef | grep sleepइसे दिखाता है)।

काम करेगा:

ssh -t -t user@remote sleep 100
^C

यह ssh सत्र को मारता है और दूरस्थ नींद की प्रक्रिया को भी मार दिया गया था। मैं भी सत्यापित किया है कि संकेत दूरस्थ प्रक्रिया को भेजी जाने वाली है SIGINT, तो आप का उपयोग करें Control- C। मैंने यह भी सत्यापित किया कि SIGKILL (-9) sshप्रक्रिया पर लागू होने से दूरस्थ प्रक्रिया भी नष्ट हो जाएगी।

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

यह सच थाsleep ... अधिक जिद्दी दूरस्थ प्रक्रियाओं के लिए, मैंने पाया कि sshहैंडल ^ C अलग ढंग से कि SIGINT। Ctrl- Cकाम किया, लेकिन kill -INT $pidनहीं किया

यहाँ मैं अपने वास्तविक आवेदन के लिए काम कर रहा हूँ (अन्य उत्तरों से चोरी)।

ssh -t -t -i id_rsa user@mic0 "/bin/sh -O huponexit -c 'sleep 100'"

डबल उद्धरण और एकल उद्धरण के नेस्टेड उपयोग पर ध्यान दें। ध्यान दें कि आपकी दूरस्थ प्रक्रिया वास्तव में बाहर निकलने से SITEUP का जवाब देना चाहिए!


इसने मेरे लिए सबसे अच्छा काम किया, लेकिन FYI करें, इसने टर्मिनल कंट्रोल कैरेक्टर्स को भी ब्लीड करने का कारण बना, जो मजेदार आउटपुट का कारण बन सकता है। इसलिए, मेरे मामले में आसान काम था कमांड्स को लपेटना और उनके आउटपुट को पाइप करना cat। उदाहरण के लिए,ssh -ttq user@host '{ cmd; cmd; } | cat'
Droj

Ctrl-Cहमेशा के बराबर नहीं है kill -INT $pid, unix.stackexchange.com/questions/377191/… पर मेरा जवाब देखें और एक और stackoverflow.com/questions/8398845/… पर Gory के विवरण के लिए ;-)
thecarl

@thecarpy - आपका पहला उत्तर कहता है कि Ctrl-C SIGINT के समान है , और दूसरा उत्तर कहता ^Cहै SIGINT भेजता है । यदि वे समान नहीं हैं तो सटीक अंतर क्या है?
मार्क लकाटा जूल

1

यदि ssh संकेतों को प्रचारित नहीं करता है तो उसे प्राप्त होता है कि आप इससे क्या उम्मीद करेंगे?

युपीडी। (जोसेफआर के लिए विशेष): यह स्पष्ट रूप से स्वयं में एक त्रुटि है जो गलतफहमी से बाहर निकलता है - "एसएच द्वारा मर जाने पर एसएच द्वारा मार दी गई प्रक्रिया"। SSH आमतौर पर प्रक्रियाओं को स्पॉन नहीं करता है (कभी-कभी यह करता है, लेकिन यह एक और कहानी है), SSHD इसके बजाय, जब हम कनेक्शन के दूसरे पक्ष को देखते हैं। SSH केवल छद्म-टर्मिनल अमूर्त रिमोट सर्वर पर निर्भर करता है। यही कारण है कि केवल एक चीज जो मदद की हो सकती है, इसकी संलग्न प्रक्रियाओं में संकेतों का उत्सर्जन करने की टर्मिनल की क्षमता है। यह हर UNIX जैसी प्रणाली के लिए कुछ हद तक बुनियादी है।


1
यह प्रश्न का उत्तर प्रदान नहीं करता है। किसी लेखक से स्पष्टीकरण मांगने या उसका अनुरोध करने के लिए, उनके पोस्ट के नीचे एक टिप्पणी छोड़ दें।
एंथन

@ एथन, यह एक स्पष्टीकरण है। लेकिन किसी का यह कहना सही उत्तर नहीं होना चाहिए। नीचे अपनी टिप्पणी के लिए धन्यवाद।
गरीब डेस

1
@poige शायद स्पष्टीकरण से बाहर है, इसलिए यह ओपी और अन्य के लिए उपयोग किया जा सकता है।
जोसेफ आर।

@JosephR।, ठीक है, सिर्फ तुम्हारे लिए।
गरीब डेस

1
अगर मैं कहता हूं कि "ssh कनेक्शन द्वारा खोई गई प्रक्रिया को जब ssh कनेक्शन खो जाता है" तो क्या यह आपके लिए बेहतर होगा? मुझे नहीं लगता कि रीफ़्रैशिंग किसी भी तरह से मेरी समस्या को हल करता है।
जर्मनके

0

यहां पोस्ट किए गए समाधान ने मेरे लिए काम नहीं किया, लेकिन चूंकि यह सवाल पहले आया था, जब मैं इसी तरह की समस्या के समाधान की खोज कर रहा था और यहां भी -t -tट्रिक का उल्लेख किया गया था, मैं उन समाधानों को पोस्ट करूंगा जो दूसरों के लिए प्रयास करने के लिए मेरे लिए काम करते हैं।

ssh -t -t -o ControlMaster=auto -o ControlPath='~/test.ssh' your_remote_ip_goes_here "your_long_running_command" &
sleep 100
ssh -o ControlPath='~/test.ssh' -O exit your_remote_ip_goes_here

जब मेरा कनेक्शन इस तरह से समाप्त हो रहा था, तब मेरी लंबी चलने वाली कमांड नहीं चल रही थी।

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