对于 shutdown 和 reboot 命令的研究

经常去 FreeBSD china 论坛潜水,发现 delphij 反复强调重启命令应该使用 shutdown -r now 而不应该使用 reboot。之前对这两条命令没怎么注意区分,这次就来深入探讨和研究下。

这篇文章包含了不少个人主观推测,不保证绝对的严谨,仅作为参考。

shutdown 命令安全地将系统关机,在关机之前,系统管理员会通知所有登录的用户系统将要关闭。并且 login 指令会被冻结,即新的用户不能再登录。直接关机或者延迟一定的时间才关机都是可能的,还可能重启。这是由所有进程都会收到系统所送达的信号决定的。这让像 vi 之类的程序有时间储存目前正在编辑的文档,而像处理邮件和新闻的程序则可以正常地离开等等。

shutdown 执行它的工作是送信号给 init 程序,要求它改变 runlevel。

shutdown 的具体执行时间,执行用户以及理由会写入系统日志,未完成的磁盘写入缓存也会回写到磁盘,以避免数据丢失。

至于 reboot,则是直接给所有进程发送 TERM 信号,同时把 reboot 行为写入系统日志。reboot 命令也会把系统更改回写到磁盘,但是 reboot 命令不会给登录用户发送 reboot 通知,因此可能导致数据丢失。

总结:如果仅作为个人使用,reboot 和 shutdown 区别不大。而如果是作为提供给多人登录的服务器,必须使用 shutdown 命令,而不应该直接使用 reboot。