Jawaban:
Tidak, cara membunuh yang tepat autossh
adalah dengan membunuh prosesnya autossh
, tidak ada yang lain.
Alasannya adalah
# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable
itu autossh
hanyalah 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 autossh
adalah dengan mematikan skrip panggilan, misalnya
pkill -3 autossh
(terima kasih kepada dviljoen untuk menunjukkan pentingnya menggunakan flag -3 , lihat di bawah). Kebetulan, mematikan ssh
koneksi tidak akan berhasil, karena perintah panggilan ( yaitu , yang di atas) hanya akan memulai koneksi baru segera setelah menyadari bahwa yang lama telah terputus.
SIGTERM
adalah default, dan yang itu 15
. SIGQUIT
adalah 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 -15
tidak mematikannya, jadi SIGTERM
tidak bisa digunakan.
pkill
tanpa 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
-9
Memastikan proses tidak keluar dengan anggun, jadi ssh
prosesnya masih ada saat autossh
proses tersebut terbunuh
tanpa -9
itu masih buruk, jika Anda memiliki beberapa terowongan berjalan, pkill
akan membunuh semuanya
cara yang benar adalah dengan mengatur AUTOSSH_PIDFILE
env var maka kill
pid itu saja
Saya tahu ini telah dijawab, tetapi bertentangan dengan komentar di atas, menggunakan pkill -3 autossh
TIDAK membunuh proses sshd child untuk saya.
Saya menggunakan fungsi ini di .bashrc
file saya .
Pada dasarnya, ini seperti menambahkan --kill
argumen 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 ssh
dan which autossh
memeriksa 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 dbserver1
membunuh hanya koneksi ke dbserver1
autossh --kill dbserver
akan membunuh dbserver1, dbserver2, dll.
autossh --kill dbserver
akan membunuh SEMUA koneksi autossh
Untuk memperjelas, itu HARUS membunuh hanya sesi SSH dimulai oleh autossh.
Jika Anda menjalankan ps aux | grep ssh
sementara 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 ssh
dan bukan path lengkap, yang mencegahnya membunuh sesi ssh normal saya.
Semoga ini bisa membantu orang lain.
$(which autossh)
bukan hanya autossh
?