Jawaban:
Tidak, cara membunuh yang tepat autosshadalah dengan membunuh prosesnya autossh, tidak ada yang lain.
Alasannya adalah
# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable
itu autosshhanyalah skrip shell, bukan layanan . Ini memulai program baru, di baris terakhirnya,
exec /usr/lib/autossh/autossh "$@"
lagi bukan layanan. Adapun exec(Anda dapat mengeceknya di wiki peretas Bash ), ini adalah perintah shell-builtin yang menggantikan shell saat ini dengan perintah berikut ( /usr/lib/autossh/autossh "$@"dalam hal ini) tanpa memulai proses baru. Jadi, satu - satunya cara untuk berhenti autosshadalah dengan mematikan skrip panggilan, misalnya
pkill -3 autossh
(terima kasih kepada dviljoen untuk menunjukkan pentingnya menggunakan flag -3 , lihat di bawah). Kebetulan, mematikan sshkoneksi tidak akan berhasil, karena perintah panggilan ( yaitu , yang di atas) hanya akan memulai koneksi baru segera setelah menyadari bahwa yang lama telah terputus.
SIGTERMadalah default, dan yang itu 15. SIGQUITadalah 3, lihat superuser.com/questions/352147/what-does-kill-3-mean dan en.wikipedia.org/wiki/Kill_(command) - Juga, FWIW, saya baru saja memeriksa dan -15tidak mematikannya, jadi SIGTERMtidak bisa digunakan.
pkilltanpa sinyal (= the default) juga tidak berakhir autossh.
jalankan ssh otomatis dengan:
AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh
bunuh dengan:
kill pid
BTW
pkill -9 autossh itu salah
-9Memastikan proses tidak keluar dengan anggun, jadi sshprosesnya masih ada saat autosshproses tersebut terbunuh
tanpa -9itu masih buruk, jika Anda memiliki beberapa terowongan berjalan, pkillakan membunuh semuanya
cara yang benar adalah dengan mengatur AUTOSSH_PIDFILEenv var maka killpid itu saja
Saya tahu ini telah dijawab, tetapi bertentangan dengan komentar di atas, menggunakan pkill -3 autosshTIDAK membunuh proses sshd child untuk saya.
Saya menggunakan fungsi ini di .bashrcfile saya .
Pada dasarnya, ini seperti menambahkan --killargumen ke autossh.
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
Anda dapat menjalankan which sshdan which autosshmemeriksa jalur di sistem Anda.
Selama argumen pertama tidak --kill, itu hanya meneruskan argumen ke autossh.
Script ini membunuh instance autossh & ssh. Ini penting jika Anda menggunakan penerusan port karena, HANYA membunuh autossh instance tidak membunuh tunnel, itu hanya mencegahnya menyambung kembali jika / ketika akhirnya terputus.
Anda juga dapat menentukan istilah pencarian (nama host) untuk membunuh hanya terowongan tertentu.
autossh --kill dbserver1membunuh hanya koneksi ke dbserver1
autossh --kill dbserverakan membunuh dbserver1, dbserver2, dll.
autossh --kill dbserverakan membunuh SEMUA koneksi autossh
Untuk memperjelas, itu HARUS membunuh hanya sesi SSH dimulai oleh autossh.
Jika Anda menjalankan ps aux | grep sshsementara Anda menjalankan sesi autossh dan ssh, Anda akan melihat bahwa sesi yang dimulai oleh autossh menggunakan path lengkap (/ usr / bin / ssh dan / usr / lib / autossh / autossh).
Script ini hanya mencocokkan hasil dengan proses yang dimulai dengan jalur speicifc. Saya melakukan ini karena saya (dan saya berasumsi kebanyakan orang) biasanya mengetik sshdan bukan path lengkap, yang mencegahnya membunuh sesi ssh normal saya.
Semoga ini bisa membantu orang lain.
$(which autossh)bukan hanya autossh?