小智 85

通常,使用shutdown命令. 它允许在关闭或重新启动之前的时间延迟和警告消息,这对于多用户 shell 服务器的系统管理很重要;它可以向用户提供停机时间的提前通知。

因此,必须像这样使用 shutdown 命令立即停止/关闭计算机(至少在 Linux 和 FreeBSD 上):

shutdown -h now
Run Code Online (Sandbox Code Playgroud)

或者使用自定义的 30 分钟提前警告重新启动它:

shutdown -r +30 "Planned software upgrades"
Run Code Online (Sandbox Code Playgroud)

延迟后,shutdown告诉init更改为运行级别 0(暂停)或 6(重新启动)。(请注意,省略-hor-r将导致系统进入单用户模式(运行级别 1),这会杀死大多数系统进程但实际上并不会停止系统;它仍然允许管理员以 root 身份保持登录状态。)

一旦系统进程被杀死并且文件系统被卸载,系统就会自动停止/关闭电源或重新启动。这是使用haltorreboot命令完成的,该命令将更改同步到磁盘,然后执行实际的暂停/关闭电源或重新启动。

在 Linux 上,如果haltreboot在系统尚未启动关闭过程时运行,它将shutdown自动调用该命令,而不是直接执行其预期操作。但是,在诸如 FreeBSD 之类的系统上,这些命令首先登录操作wtmp,然后立即自行执行暂停/重新启动,而无需首先终止进程或卸载文件系统。

  • ……但现在已经过时了。在 systemd Linux 操作系统上,这些命令存在(用 systemd doco 的话来说)“仅用于兼容性”。没有单独的“halt”、“rebo​​ot”和“shutdown”程序相互调用。有一个单一的程序,有很多命令行解析器,它们在内部汇集到一个代码路径中。也没有运行级别。关机也不会进入单用户模式。事实上,单用户模式本身已被重命名。有关详细信息,请参阅 http://unix.stackexchange.com/a/196014/5132。 (24认同)

Jde*_*eBP 63

过去

在20世纪80年代,BSD系统有haltrebootshutdown。System 5 UNIX 有一个 BSD 兼容性工具集。但它天生就有自己的、不同的shutdown命令;并且没有halt或根本没有reboot。(某些 System 5 变体具有 SCO XENIX 之类的东西haltsys。)

BSDhaltreboot命令是低级的、激烈的和直接的。关闭 BSD 系统的体贴方式是shutdown命令,它完成了人们期望发生的所有事情:wall向用户发送消息、优雅地终止服务、写入日志条目、禁用登录等等。

虽然 BSD 主要是“ shutdownexecs halt/ reboot”所获得的智慧的起源,并且后者需要谨慎使用;在 System 5 世界中,人们养成了相反的习惯,即halt/reboot只是方便的速记,仅此而已:/usr/ucb/halt从“BSD 兼容包”中, 与shutdown -h. 他们最终都做了init 0

进一步阅读

今天

如今,我们拥有一系列可能的系统管理工具集。BSD 仍然有他们的工具集,尽管在 1990 年代清除了任何可能的 AT&Tism。Miquel van Smoorenburg 在 1992 年(重新)编写了一个 Linux init+rc及其相关工具,人们现在将其称为“System 5 init”,尽管它实际上并不是来自 UNIX System 5 的软件(并且不仅仅是init)。还有systemdupstartnosh,每个都有自己haltrebootfasthaltfastboot等实现。

工具集也得到了发展和改变。现在有一个poweroff命令,在 1980 年代的操作系统中不存在,因为大多数当代机器上的中央处理单元无法控制它们的电源。尤其是 Linux 工具集已经获得了 BSD 命令;但是就像 UNIX System 5 上的 BSD 兼容性工具一样,它们并不是完全相同的,并且已经在很大程度上扁平化了。

这种扁平化给我们带来的地步,halt并且shutdown大多是相同的。但确切的细节因工具集而异,每个工具集的机制都略有不同。

它还让我们陷入了一个有点尴尬的境地,这个命令集变得如此具有兼容性选项,以至于它现在允许人们向计算机发出自相矛盾的指令,例如reboot --haltpoweroff --reboot,正如我在 nosh 的手册页中所指出的那样haltfasthalt, reboot, fastboot,和poweroff命令。?

systemd 工具集

haltrebootpowerofftelinit、 和shutdown都是一个程序。它实际上是systemd自己的systemctl程序。它有几个命令行解析器,用于这些命令的各种命令行语法,以及它自己的语法分析器,但之后主要在内部汇集到一个代码路径中。使用halt及其命令选项触发操作与使用shutdown及其命令选项触发相同操作之间没有区别。

systemd 不会将救援模式(即 systemd 人员重命名的单用户模式)视为关闭系统状态,并且无法使用任何这些命令访问它。无选项shutdown nowpoweroff.

进一步阅读:

BSD

BSD 在很大程度上保留了 1980 年代的语义。 haltshutdown因此非常以他们的工具集等价的。 halt并且reboot是一个单一的程序;并且仍然是低水平的、直接的和激烈的。而shutdownandpoweroff也是一个程序,可以完成所有考虑周到的事情,例如计划关闭、编写wall消息、记录操作、禁用登录等。

在 BSD 工具集中,shutdown/poweroff传统上最终会调用halt/reboot来制定最终的系统状态更改。“ shutdownexecs halt/ reboot”实际上仍然适用于NetBSD和OpenBSD (现在经常不正确)获得的智慧。但是在 FreeBSD/TrueOS/DragonFlyBSD 上,只有-o使用该选项时才会出现这种情况。这些BSD系统,这些程序的正常颁布通过发送各种信号(最后的系统状态改变INTUSR1USR2)来处理#1。 init确实在这些系统上的系统状态管理。

在所有的人,选择少shutdown now不等同于任何的haltrebootpoweroff。它转换到BSD单用户模式,从其中一个可转变多用户模式

进一步阅读:

nosh 工具集

在 nosh 系统管理工具集中haltfasthaltpowerofffastpoweroffreboot、 和fastboot都是一个程序。这是一个向后兼容的垫片,通常简单地链接到shutdown接受的智慧相反。该--force选项使其链接到system-control

因此,此工具集中--forcehalt命令和shutdown命令(具有等效选项)之间没有区别(不存在),因为这组“BSD/System 5 兼容性”命令只是shutdown.

进一步阅读:

新贵工具集

与 nosh 一样,在 upstart 系统管理工具集中,与收到的 BSD 智慧相反。 halt, reboot, 和poweroff都是一个程序,通常链接到shutdown; 除非使用该--force选项,这使得reboot()系统调用本身。

因此,在此工具集中--forcehalt命令和shutdown命令(具有等效选项)之间没有区别(不存在)。同时再次,选项少shutdown now(其中没有haltreboot或者poweroff可以结束了调用,因为他们所有的设置选项)使系统进入单用户模式,而不是将其关闭。

进一步阅读:

Linux System 5 init+rc工具集

同样,在这个工具集中,与收到的 BSD 智慧相反,halt并且reboot简单地链接到shutdown- 除非系统已经处于断电或暂停“运行级别”,在这种情况下,这些命令实际上会执行最终的系统状态更改。 shutdown依次链接到init

因此,再一次,两者之间没有区别(除非系统已经在很大程度上关闭)haltshutdown因为前者只是调用后者。是的,再次,选择少shutdown now(其中没有haltreboot或者poweroff可以结束了调用,因为他们所有的设置选项)使系统进入单用户模式,而不是将其关闭。


小智 12

我怀疑这在某种程度上取决于您使用的 UNIX/Linux 版本。在 Centos(以及我预计其他现代 Linux)上,halt 调用 shutdown(假设您不在运行级别0 或 6),因此您的系统将干净地关闭。在 Solaris 10 上,暂停更为残酷,它只是刷新磁盘缓存并关闭系统电源 - 不会尝试运行任何脚本或关闭smf设施。