Câu trả lời:
Không, cách giết người thích hợp autossh
chỉ đơn giản là giết quá trình autossh
, không có gì khác.
Lý do là
# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable
đó autossh
chỉ đơn giản là một kịch bản shell, không phải là một dịch vụ . Nó bắt đầu một chương trình mới, ở dòng cuối cùng của nó,
exec /usr/lib/autossh/autossh "$@"
lại không phải là một dịch vụ. Đối với exec
(bạn có thể kiểm tra kỹ nó trong wiki của tin tặc Bash ), đó là một lệnh shell-shell thay thế shell hiện tại bằng lệnh sau ( /usr/lib/autossh/autossh "$@"
trong trường hợp này) mà không bắt đầu một quy trình mới. Vì vậy, cách duy nhất để dừng lại autossh
là giết tập lệnh gọi
pkill -3 autossh
(cảm ơn dviljoen vì đã chỉ ra tầm quan trọng của việc sử dụng cờ -3 , xem bên dưới). Ngẫu nhiên, việc hủy ssh
kết nối sẽ không hoạt động, bởi vì lệnh gọi ( nghĩa là lệnh ở trên) sẽ chỉ bắt đầu một kết nối mới ngay khi nhận ra kết nối cũ đã bị hủy.
SIGTERM
là mặc định, và đó là một 15
. SIGQUIT
là 3
, xem superuser.com/questions3532147/what-does-kill-3-mean và en.wikipedia.org/wiki/Kill_(command) - Ngoài ra, FWIW, tôi chỉ kiểm tra và -15
không tắt nó, vì vậy SIGTERM
không thể được sử dụng.
pkill
không có tín hiệu (= the default
) cũng không chấm dứt autossh
.
chạy ssh tự động với:
AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh
giết nó bằng:
kill pid
BTW
pkill -9 autossh
là một sai
-9
đảm bảo quy trình không thoát ra một cách duyên dáng, vì vậy ssh
quy trình vẫn ở đó khi autossh
quy trình bị giết
mà -9
vẫn không tệ, nếu bạn có nhiều đường hầm đang chạy, pkill
sẽ giết tất cả
Cách chính xác là đặt AUTOSSH_PIDFILE
env var thì kill
pid đó thôi
Tôi biết điều này đã được trả lời, nhưng trái với các ý kiến trên, sử dụng pkill -3 autossh
KHÔNG giết chết các quy trình con sshd cho tôi.
Tôi sử dụng chức năng này trong .bashrc
tập tin của tôi .
Về cơ bản, nó giống như thêm một --kill
đối số vào 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
Bạn có thể chạy which ssh
và which autossh
kiểm tra các đường dẫn trên hệ thống của bạn.
Miễn là đối số đầu tiên không có --kill
, nó chỉ chuyển các đối số sang chế độ tự động.
Kịch bản này giết chết các trường hợp autossh & ssh. Điều này rất quan trọng nếu bạn đang sử dụng chuyển tiếp cổng bởi vì, CHỈ giết cá thể autossh không giết đường hầm, nó chỉ ngăn nó kết nối lại nếu / khi cuối cùng nó ngắt kết nối.
Bạn cũng có thể chỉ định một thuật ngữ tìm kiếm (tên máy chủ) để chỉ giết các đường hầm cụ thể.
autossh --kill dbserver1
Chỉ giết các kết nối đến dbserver1
autossh --kill dbserver
sẽ giết dbserver1, dbserver2, v.v.
autossh --kill dbserver
sẽ giết TẤT CẢ các kết nối tự động
Để làm rõ, nó chỉ NÊN giết các phiên SSH được bắt đầu bằng autossh.
Nếu bạn chạy ps aux | grep ssh
trong khi bạn có cả phiên autossh và ssh đang chạy, bạn sẽ thấy những phiên bắt đầu bằng autossh sử dụng đường dẫn đầy đủ (/ usr / bin / ssh và / usr / lib / autossh / autossh).
Kịch bản này chỉ khớp kết quả với các quy trình bắt đầu với đường dẫn speicifc. Tôi đã làm điều này bởi vì tôi (và tôi giả sử hầu hết mọi người) thường gõ ssh
và không phải là đường dẫn đầy đủ, điều này giúp nó không giết chết các phiên ssh bình thường của tôi.
Hy vọng điều này sẽ giúp người khác.
$(which autossh)
thay vì đơn giản autossh
?