当我这样做时,sudo reboot -f服务器重新启动,但终端只显示“重新启动”并且不退出。我必须实际按下ctrl-c才能让它退出。有没有办法让服务器退出而无需我按ctrl-c. 我也必须使用sudo reboot -f.
当您使用时sudo reboot -f,操作系统会执行快速重新启动:内核执行最少的必要操作来关闭,而不会严重损坏文件系统。在快速重新启动中,进程的正确终止(包括sshd)被认为是不重要的。当内核专注于快速刷新磁盘缓存和任何其他内核级关闭操作时,调度程序将停止为进程提供更多执行时间。
(因此,某些文件可能会保持打开状态。但是,在现代日志文件系统上,只要考虑到文件系统,这些问题通常可以通过启动时的快速文件系统检查来修复。但是具有重要内部结构的文件,例如数据库,可能会处于不一致的状态。如果是这样,他们可能需要特定于应用程序的恢复操作...教训:除非绝对必要,否则不要使用reboot -f。 )
与此同时,您的远程访问客户端将处于挂起状态:从它的角度来看,服务器发送了最后一条消息“正在重新启动”......然后根本没有任何响应。没有 SSH 连接终止,甚至没有 TCP FIN。只是沉默。
客户端将遵循正常的 TCP 重试规则。这可能需要几分钟的时间,在此期间不会发生任何可见的事情...但在这段时间里,客户端系统的操作系统会一次又一次地尝试重新发送远程访问客户端在重新启动命令后可能发送的任何传出数据包。
如果服务器需要很长时间进行自检和重新启动,则连接最终将超时,因为客户端操作系统的 TCP 堆栈放弃尝试并向远程访问应用程序报告错误。这通常需要几分钟的时间。
但是,如果服务器快速重新启动,当它达到再次激活其网络接口的程度时,服务器的操作系统将看到来自远程访问客户端的传入数据包。然后,服务器将查阅其新初始化的活动网络连接表,断定不存在此类连接的记录,并发回 TCP 重置。当您的客户端收到该消息时,它才会报告连接已被强制终止。