Halt和Shutdown命令有什么区别?


Answers:


77

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

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

shutdown -h now

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

shutdown -r +30 "Planned software upgrades"

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

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

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


很好的解释!

18
……但是现在已经过时了。在systemd Linux操作系统上,这些命令“仅出于兼容性”而存在(用systemd doco的话来说)。没有单独的haltrebootshutdown彼此调用的程序。这里只有一个程序,有很多命令行解析器,它们在内部汇入一个代码路径。也没有运行级别。关机也不会进入单用户模式。实际上,单用户模式本身已被重命名。有关详细信息,请参见unix.stackexchange.com/a/196014/5132
JdeBP

49

过去

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

BSD haltreboot命令是低级的,激烈的和即时的。关闭BSD系统的审慎方法是执行该shutdown命令,该命令完成了人们期望发生的所有事情:wall发给用户的消息,正常终止的服务,写入的日志条目,禁用的登录等等。

尽管BSD在很大程度上是人们所接受的智慧的发源地,即“ shutdown执行者halt/ reboot”,并且谨慎使用后者。在System 5世界中,人们学到了相反的习惯,即halt/ reboot只是惯用的速记,仅此而已:/usr/ucb/halt从“ BSD兼容性软件包”中获得的效果与没什么不同shutdown -h。他们俩最终都干了init 0

进一步阅读

今天

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

工具集也已经增长和改变。现在有一个poweroff命令,在1980年代的操作系统中不存在,因为大多数现代机器上的中央处理单元无法控制其电源。特别是Linux工具集已经获得了BSD命令。但是,就像UNIX System 5上的BSD兼容性工具一样,它们并不是完全一样的东西,并且已大体上变得平坦。

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

这也给我们带来了略显尴尬位置,此指令集已经与兼容性选项,它现在允许人们给计算机系统如自相矛盾的指令变得如此妆点reboot --haltpoweroff --reboot,正如我在为NOSH手册页指出haltfasthaltrebootfastboot,和poweroff命令。☺

系统工具集

haltrebootpowerofftelinit,和shutdown所有的一个程序。它实际上是systemd自己的systemctl程序。它具有多个命令行解析器,用于这些命令的各种命令行语法以及它自己的语法,但是在此之后,它们很大程度上在内部集中到一个代码路径中。使用halt及其命令选项来触发操作与使用shutdown及其命令选项来触发相同操作没有区别。

systemd不会将救援模式(这是systemd的人已将其重命名为单用户模式)视为关闭的系统状态,并且使用任何这些命令都无法达到该状态。少选项shutdown now与相同poweroff

进一步阅读:

BSD

BSD在很大程度上保留了1980年代的语义。 haltshutdown因此非常以他们的工具集等价的。 halt并且reboot是一个单一的程序;并且仍然处于低水平,即时和激烈的状态。而shutdownpoweroff也是一个程序,可以完成所有体贴的工作,例如计划关闭,编写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一样,在新贵的系统管理工具集中,收到的BSD智慧也适用。 haltrebootpoweroff,通常都是链到的一个程序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可以结束了调用,因为他们所有的设置选项)使系统进入单用户模式,而不是将其关闭。


这就是为什么当80%的选民投票系统不起作用的原因
ychaouche

您说:“停止和重新启动是一个程序;并且仍然处于低级,即时和激烈的状态”,似乎并非如此。我引用了DragonflyBSD的停止手册页,其中说:停止和重新启动实用程序将文件系统缓存刷新到磁盘,向所有正在运行的进程发送SIGTERM(然后是SIGKILL),然后分别停止或重新启动系统。将记录该操作,包括在wtmp(5)文件中输入关闭记录。请参阅:dragonflybsd.org/cgi/web-man?command=halt§ion=ANY
ychaouche

现在,重新阅读答案,以获取已经明确给出的(两次以上)不在列表中的内容。在各种BSD的系统管理员手册中也有详细说明。
JdeBP '18 -4-3

什么列表@JdeBP?
ychaouche

11

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


2

对于那些谁使用AWS EC2:在AWS上shutdown 停止的情况下,当halt 终止它。


stop终止有什么区别?
roaima

那是完全不同的主题,不在这里,这就是为什么我没有提到它。但是您可以看一下docs.aws.amazon.com/AWSEC2/latest/UserGuide/…–
dveim

1
因此,在您的回答中,您说的是stop执行了所说的操作,并停止了实例,而halt(或用您的替代术语,terminate)停止了实例并将其删除。
roaima

是。但这是特定于AWS的。
dveim

啊。我懂了。OP未提供上下文。你有。谢谢。
roaima

0

在linux中,“ halt”和“ reboot”分别是shutdown命令的别名- shutdown -hshutdown -r。密码关闭通常假定为-h。


10
它们不是aliasesshell别名的意思,但是是的,halt基本上只是call shutdown -hrebootrun shutdown -r。请注意,如果将-f(force)选项传递给haltrebootshutdown不会调用。
Mikel

实际上,尽管仍然是错误的,但是在系统化操作系统上,Shadur的描述比Mikel的修正更接近于事实。没有“ A只叫B”。它们都是调用单个程序的替代方法,如unix.stackexchange.com/a/196014/5132所述
JdeBP

@JdeBP回到我写这个systemd不到一年的时间,我什至从未听说过它。:)
Shadur 2015年

1
@JdeBP我把它们等同起来,比方说,在sendmail此时命令-像与MTA的,实际上它并不不管你使用哪种初始化系统,因为所有的人都会认识到这两个shutdownhalt这样。
Shadur

1
实际上,这很重要。因为工具集之间存在细微的差异,甚至确实是细微的差异。具有讽刺意味的是,sendmail命令也是如此。这就像sendmail命令,但并非您的想法。
JdeBP
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.