Khi bạn tắt máy hoặc khởi động lại hệ thống, hãy systemd
cố gắng dừng tất cả các dịch vụ nhanh nhất có thể. Điều đó liên quan đến việc hạ thấp mạng và chấm dứt tất cả các quy trình vẫn còn sống - thường theo thứ tự đó. Vì vậy, khi systemd giết chết các tiến trình SSH rẽ nhánh đang xử lý các phiên SSH của bạn, kết nối mạng đã bị vô hiệu hóa và chúng không có cách nào đóng kết nối máy khách một cách duyên dáng.
Suy nghĩ đầu tiên của bạn có thể là giết tất cả các quy trình SSH là bước đầu tiên trong quá trình tắt máy và có khá nhiều tệp dịch vụ systemd ngoài đó thực hiện điều đó.
Nhưng tất nhiên có một giải pháp gọn gàng hơn (cách thức "được cho là" phải được thực hiện) : systemd-logind
.
systemd-logind
theo dõi các phiên người dùng đang hoạt động (cục bộ và SSH) và gán tất cả các quy trình được sinh ra trong chúng cho cái gọi là "lát". Theo cách đó, khi hệ thống ngừng hoạt động, systemd chỉ có thể SIGTERM mọi thứ bên trong các lát cắt của người dùng (bao gồm quá trình SSH rẽ nhánh đang xử lý một phiên cụ thể) và sau đó tiếp tục tắt các dịch vụ và mạng.
systemd-logind
yêu cầu mô-đun PAM để được thông báo về các phiên người dùng mới và bạn sẽ cần dbus
sử dụng loginctl
để kiểm tra trạng thái của nó, vì vậy hãy cài đặt cả hai:
apt-get install libpam-systemd dbus
Hãy chắc chắn rằng bạn /etc/ssh/sshd_config
thực sự sẽ sử dụng mô-đun với UsePAM yes
.