Câu trả lời:
Không, cách giết người thích hợp autosshchỉ đơ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
đó autosshchỉ đơ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 autosshlà 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 sshkế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.
SIGTERMlà mặc định, và đó là một 15. SIGQUITlà 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à -15không tắt nó, vì vậy SIGTERMkhông thể được sử dụng.
pkillkhô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 sshquy trình vẫn ở đó khi autosshquy trình bị giết
mà -9vẫn không tệ, nếu bạn có nhiều đường hầm đang chạy, pkillsẽ giết tất cả
Cách chính xác là đặt AUTOSSH_PIDFILEenv var thì killpid đó 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 autosshKHÔ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 .bashrctậ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 sshvà which autosshkiể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 dbserver1Chỉ giết các kết nối đến dbserver1
autossh --kill dbserversẽ giết dbserver1, dbserver2, v.v.
autossh --kill dbserversẽ 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 sshtrong 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õ sshvà 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?