जवाबों:
नहीं, मारने 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 dbserver1
dbserver1 करने के लिए सिर्फ कनेक्शन को मारता है
autossh --kill dbserver
dbserver1, dbserver2, आदि मार डालेगा
autossh --kill dbserver
मार डालेगा सभी autossh कनेक्शन
स्पष्ट करने के लिए, यह ऑटोह द्वारा शुरू किए गए केवल SSH सत्रों को मारता है।
यदि आप ps aux | grep ssh
ऑटोसोश और ssh सत्र चलाते हुए चलते हैं, तो आप देखेंगे कि autossh द्वारा शुरू किए गए पूर्ण पथ (/ usr / bin / ssh और / usr / lib / autossh / autossh) का उपयोग करते हैं।
यह स्क्रिप्ट केवल speicifc पथ के साथ आरंभ की गई प्रक्रियाओं से मेल खाती है। मैंने ऐसा इसलिए किया क्योंकि मैं (और मैं ज्यादातर लोगों को मानता हूं) आमतौर पर ssh
पूर्ण पथ टाइप करते हैं, न कि मेरे सामान्य सत्रों को मारने से।
आशा है कि यह दूसरों की मदद करेगा।
$(which autossh)
बस के बजाय के लिए कोई विशेष कारण autossh
?