जवाबों:
नहीं, मारने autosshका उचित तरीका केवल प्रक्रिया को मारना है autossh, और कुछ नहीं।
कारण यह है की
# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable
कि autosshबस एक खोल स्क्रिप्ट, नहीं एक है सेवा । यह एक नया कार्यक्रम शुरू करता है, इसकी अंतिम पंक्ति में,
exec /usr/lib/autossh/autossh "$@"
फिर से सेवा नहीं। जैसा कि exec(आप बैश हैकर्स की विकी में इसे डबल-चेक कर सकते हैं ), यह एक शेल-बिल्टिन कमांड है, जो /usr/lib/autossh/autossh "$@"नई प्रक्रिया शुरू किए बिना वर्तमान कमांड ( इस मामले में) के साथ वर्तमान शेल को बदल देता है। इसलिए, रोकने का एकमात्र तरीका autosshउदाहरण के लिए, कॉलिंग स्क्रिप्ट को मारना है
pkill -3 autossh
( -3 ध्वज का उपयोग करने के महत्व को इंगित करने के लिए डीवीलोज़ेन का धन्यवाद , नीचे देखें)। संयोग से, कनेक्शन को मारने से काम नहीं चलेगा, क्योंकि कॉलिंग कमांड ( यानी , ऊपर वाला) बस एक नया कनेक्शन शुरू करेगा जैसे ही यह पता चलता है कि पुराने को हटा दिया गया है। ssh
SIGTERMडिफ़ॉल्ट है, और वह एक है 15। SIGQUITहै 3, को देखने के superuser.com/questions/352147/what-does-kill-3-mean और en.wikipedia.org/wiki/Kill_(command) - इसके अलावा, Fwiw, मैं बस की जाँच की और -15इसे बंद नीचे नहीं करता है, इसलिए SIGTERMउपयोग नहीं किया जा सकता है।
pkillबिना किसी सिग्नल (= default) के उपयोग से भी समाप्ति नहीं होती है autossh।
के साथ ऑटो ssh चलाएं:
AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh
इसे मार डालो:
kill pid
BTW
pkill -9 autossh गलत है
-9सुनिश्चित करें कि प्रक्रिया इनायत से बाहर नहीं निकल रही है, इसलिए प्रक्रिया की मौत sshहोने पर भी autosshप्रक्रिया जारी है
बिना -9अभी भी खराब है, अगर आपके पास कई सुरंगें चल रही हैं, pkillतो उन सभी को मार देगा
सही तरीका यह है कि केवल AUTOSSH_PIDFILEएनवी var सेट करना हैkill
मुझे पता है कि यह उत्तर दिया गया है, लेकिन उपरोक्त टिप्पणियों के विपरीत, pkill -3 autosshमेरे लिए sshd चाइल्ड प्रक्रियाओं को नहीं मारता है।
मैं अपनी .bashrcफ़ाइल में इस फ़ंक्शन का उपयोग करता हूं ।
मूल रूप से, यह --killआटोश में एक तर्क जोड़ने जैसा है।
if [ "$1" = "--kill" ]; then
ps aux |
grep -P "(/usr/bin/ssh|/usr/lib/autossh/autossh)\s.*$2" |
awk '{print $2}' |
xargs -r kill
else
$(which autossh) "$@"
echo "" # prevents line wrapping when you kill the ssh process
fi
आप चला सकते हैं which sshऔर which autosshअपने सिस्टम पर रास्तों की जाँच करने के।
जब तक पहला तर्क नहीं है --kill, तब तक यह ऑटो के साथ आर्ग्स को पार करता है।
यह स्क्रिप्ट ऑटोश और ssh उदाहरणों को मारती है। यह महत्वपूर्ण है यदि आप पोर्ट फ़ॉरवर्डिंग का उपयोग कर रहे हैं क्योंकि, केवल ऑटोसोश उदाहरण को मारने से सुरंग को नहीं मारता है, यह सिर्फ इसे फिर से कनेक्ट करने से रोकता है अगर / जब यह अंत में डिस्कनेक्ट करता है।
आप केवल विशिष्ट सुरंगों को मारने के लिए खोज शब्द (होस्ट नाम) भी निर्दिष्ट कर सकते हैं।
autossh --kill dbserver1dbserver1 करने के लिए सिर्फ कनेक्शन को मारता है
autossh --kill dbserverdbserver1, dbserver2, आदि मार डालेगा
autossh --kill dbserverमार डालेगा सभी autossh कनेक्शन
स्पष्ट करने के लिए, यह ऑटोह द्वारा शुरू किए गए केवल SSH सत्रों को मारता है।
यदि आप ps aux | grep sshऑटोसोश और ssh सत्र चलाते हुए चलते हैं, तो आप देखेंगे कि autossh द्वारा शुरू किए गए पूर्ण पथ (/ usr / bin / ssh और / usr / lib / autossh / autossh) का उपयोग करते हैं।
यह स्क्रिप्ट केवल speicifc पथ के साथ आरंभ की गई प्रक्रियाओं से मेल खाती है। मैंने ऐसा इसलिए किया क्योंकि मैं (और मैं ज्यादातर लोगों को मानता हूं) आमतौर पर sshपूर्ण पथ टाइप करते हैं, न कि मेरे सामान्य सत्रों को मारने से।
आशा है कि यह दूसरों की मदद करेगा।
$(which autossh)बस के बजाय के लिए कोई विशेष कारण autossh?