为什么“shutdown -r now”的行为与Debian Linux的“rebo​​ot -f”不同?

我最近不得不面对一个烦人的,间歇性的NFS客户机/服务器挂载点问题。 当客户端发生问题时,我不能卸载以及其他一些奇怪的行为。 我唯一的直接解决scheme是重新启动客户端。

但是shutdown -r now根本不起作用。 自从我发现了reboot -f ,它重启系统。 为什么? 我已阅读手册页,但似乎没有回答我的问题。

为什么shutdown -r now行为与reboot -f不同?

(我正在继续解决NFS问题,但这不是我的问题。)

从关机手册页:

一旦TIME过去,关机会向init(8)守护进程发送请求,使系统进入适当的运行级别。

init在系统更改运行级别时启动和停止作业。 由于重新启动而进入运行级别6时,系统将运行/etc/rc6.d中的所有脚本。 由于你的系统没有响应shutdown ,可能是/etc/rc6.d的脚本(可能是K05nfs-common因为你的NFS问题)卡住了,不允许closures序列完成。 实际上,当改变到运行级别6时,init运行的最后一件事是reboot -d -f -i

reboot -f跳过所有脚本并直接重启系统。

shutdown指示init开始closures过程,这包括让已login的用户知道系统正在closures,优雅地终止所有进程,卸载和同步驱动器等等。 你被挂在这里,因为进程等待IO往往是非常难以杀死,你的卡住的NFS挂载不能卸载。

reboot -f ,另一方面立即重新启动服务器而不做任何的。 ( reboot是程序init调用closures服务器,如果没有-f标志,它会检查init认为它正在重新启动,如果没有,它会调用shutdown来启动进程)。

因为'reboot -f'没有进入运行级别0,它会通知操作系统直接重新初始化CPU。 我最近的Linux上的手册页说:

  -f Force halt or reboot, don't call shutdown(8) 

关机手册页解释更多。

如果在NFS挂载中使用intr选项,那么shutdown -r now应该能够终止等待NFS IO的进程来完成。 这可能会导致文件损坏,但可能不会超过shutdown -f创build。