Lệnh reboot -f
không bao giờ trả lại (trừ khi bạn không có quyền gây ra khởi động lại). Tại thời điểm phát hành, máy khách SSH đang chờ một cái gì đó để làm, đó có thể là:
- máy chủ SSH thông báo cho khách hàng rằng có một cái gì đó đã xảy ra đòi hỏi sự chú ý của nó, ví dụ như có một số đầu ra để hiển thị hoặc lệnh từ xa đã kết thúc;
- một số sự kiện ở phía khách hàng, chẳng hạn như tín hiệu chuyển tiếp;
- một bộ đếm thời gian kích hoạt để khiến khách hàng gửi tin nhắn cố định (và đóng kết nối nếu máy chủ không trả lời).
Vì quá trình máy chủ SSH đã chết, máy khách SSH sẽ không chết cho đến khi bộ đếm thời gian kích hoạt.
Nếu bạn chạy ssh remotehost 'reboot -f >/dev/null &'
, thì những gì xảy ra là:
- Shell từ xa khởi chạy
reboot
lệnh trong nền.
- Vì lệnh shell phía máy chủ đã thoát và không có quá trình giữ bộ mô tả tệp cho đầu ra tiêu chuẩn mở, máy chủ SSH sẽ đóng kết nối.
- Các
reboot
lệnh gây ra máy để khởi động lại.
Tuy nhiên, điều này không đáng tin cậy: tùy thuộc vào thời gian, bước 3 có thể xảy ra trước bước 2. Thêm bộ hẹn giờ khiến điều này khó xảy ra:
ssh remotehost '{ sleep 1; reboot -f; } >/dev/null &'
Để chắc chắn rằng phía máy chủ cam kết chạy reboot
, trong khi đảm bảo rằng nó không thực sự khởi động lại trước khi thông báo cho khách hàng rằng nó đã được cam kết, bạn cần một thông báo bổ sung để đi từ máy chủ đến máy khách. Đây có thể là đầu ra thông qua kết nối SSH, nhưng nó trở nên phức tạp.