这些用于关闭Linux服务器的命令之间有什么区别?


65

阅读“停止和关闭命令之间有什么区别?” ,我通常对使用或不使用-h / -r选项的命令关闭功能有什么了解。

“停止”命令将关闭系统电源,使其进入系统的运行级别0。

“关闭”命令无需执行-h或-r命令即可关闭系统电源,以运行级别1。

命令“ poweroff”进入运行级别0或1怎么办?这是这三个命令之间的唯一主要区别吗?



对于Solaris和FreeBSD,这是一些明显不同的东西。(他们通常(几乎)在那里立即停止/关闭服务器,而无需更改运行级别先关闭服务器)
Gert van den Berg

Answers:


120

现在,系统化的答案。

根据问题上的标签,您正在使用Red Hat Enterprise Linux。从版本7开始,就使用了systemd。对于systemd的世界,没有其他答案是正确的。您的问题中甚至没有一些假设。

  • 忘记运行级 ; 它们存在,但仅作为兼容性垫片。系统文档说明该概念已“过时”。如果您开始在systemd操作系统上学习这些知识,请不要从那里开始。
  • 忘记marcelm引用的手册页;它根本不是来自正确的工具集,而是对另一个工具集命令的描述,不适用于systemd。这是halt从van Smoorenburg“ System 5” init实用程序发出命令的命令之一。
  • 忽略到/sbin/halt符号链接的语句/sbin/reboot; systemd并非如此。根本没有单独的reboot程序。
  • 忽略语句haltreboot调用shutdown与命令行参数程序; 对于systemd,它们也不正确。根本没有单独的shutdown程序。

每个系统管理工具集都有这些实用程序的版本。systemd,暴发户,nosh,van Smoorenburginit和BSD init都有自己的haltpoweroff等等。在每个方面,他们的机制略有不同。他们的手册页也是如此。

在systemd工具集haltpoweroffreboottelinit,和shutdown所有的符号链接/bin/systemctl。他们向后兼容性垫片,这仅仅是用于调用systemd的主要命令行界面速记:systemctl。它们都映射到(实际上是)相同的单个程序。(根据约定,shell会告诉它调用它的名称。)

目标,而不是运行级别

这些命令大多数是用于告诉systemd使用systemctl隔离特定目标的简写。隔离在systemctl手册页(qv)中进行了说明,但出于此答案的目的,可以将其视为启动目标并停止其他目标。systemd.special(8)手册页上列出了systemd中使用的标准目标。

bootupsystemd工具集中(7)手册页上的图表,尤其是最后一个,显示了此处涉及的三个“最终”目标:

  • halt.target—一旦系统达到完全隔离此目标的状态,它将调用reboot(RB_HALT_SYSTEM)系统调用。内核将尝试进入ROM监视程序,或者只是停止CPU(使用适当的任何机制)。
  • reboot.target—一旦系统达到完全隔离此目标的状态,它将调用reboot(RB_AUTOBOOT)系统调用(或与magic命令行等效的调用)。内核将尝试触发重启。
  • poweroff.target—一旦系统达到完全隔离此目标的状态,它将调用reboot(RB_POWER_OFF)系统调用。如果可能,内核将尝试从系统中关闭电源。

这些是您在最终系统状态(而不是运行级别)中应该考虑的事情。从图中注意到,系统化的目标系统本身对其他系统中隐式而不是显式的事物进行编码:例如这些最终目标中的每个目标都包含shutdown.target目标的概念,因此必须描述必须在停止之前停止的服务让他们有冲突shutdown.target目标。

systemctlsystemd-logind当主叫用户不是超级用户时,尝试将请求发送到。它还会将延迟的关闭时间传递到systemd-shutdownd。还有一些速记会触发wall通知。除了这些复杂性之外,假设您当前是超级用户并且不请求计划的操作,那么此答案将使答案延长几倍。

  • systemctl isolate halt.target 简写为:
    • shutdown -H now
    • systemctl halt
    • 朴实无华 halt
  • systemctl isolate reboot.target 简写为:
    • shutdown -r now
    • telinit 6
    • systemctl reboot
    • 朴实无华 reboot
  • systemctl isolate poweroff.target 简写为:
    • shutdown -P now
    • telinit 0
    • shutdown now
    • systemctl poweroff
    • 朴实无华 poweroff
  • systemctl isolate rescue.target 简写为:
    • telinit 1
    • systemctl rescue
  • systemctl isolate multi-user.target 简写为:
    • telinit 2
    • telinit 3
    • telinit 4
  • systemctl isolate graphical.target 简写为:
    • telinit 5

在解析了各种不同的命令行语法之后,这些最终都最终以systemctl程序内部的相同代码路径结尾。

笔记:

  • 少选项的传统行为是shutdown now切换到单用户模式。systemd并非如此。 rescue.target- 在systemd中将单用户模式重命名为救援模式 -该shutdown命令无法访问。
  • telinit 确实完全忽略了手册页描述的文件系统中的所有那些链接和符号链接。表中将上述映射硬连线到程序中。runlevelN.targetdefault.targetsystemctl
  • systemd没有当前运行级别的概念。这些命令的操作不以任何“如果您处于运行级别N ”为条件。
  • --force选项的haltrebootpoweroff命令是一样的话说--force --forcesystemctl haltsystemctl rebootsystemctl poweroff命令。这使得systemctl尝试reboot()直接呼叫。通常,它只是试图隔离目标。
  • telinitinit。它们是系统世界中的不同程序,后者是该systemd程序的另一个名称,而不是该systemctl程序的名称。该systemd程序不一定完全具有任何van Smoorenburg兼容性,并且在某些系统化的操作系统上抱怨如果尝试一次,将导致错误地调用该程序。init N

进一步阅读


1
对于大多数现代Linux系统而言,这是非常通用的,因此例如回答wiert.me/2012/12/30/…经过多年的思考,我终于明白了发生了什么以及为什么。
Jeroen Wiert Pluimers

systemctl reboot应该等于systemctl start reboot.target --job-mode=replace-irreversible。使用任何其他作业模式都不太可靠。 unix.stackexchange.com/questions/381739/…–
sourcejedi

1
我阅读了您的全部回复,并全力以赴。一个问题仍然存在,我在这里也提到了同样的问题,那就是systemctl reboot“安全”重启方式,例如init 6,否则我们将安全重启吗?
布莱恩·托马斯

25
  • halt指示硬件停止所有CPU功能,但将其保持在开机状态。这通常意味着有人必须随后通过按电源按钮来手动重新引导或关闭计算机。实现此目标的特定方法是特定于体系结构的,但是例如x86指令集提供了HLT可暂停中央处理单元(CPU)直到发出下一个外部中断的指令。

  • poweroff,例如halt,停止CPU,但还会发送ACPI硬件信号,该信号将指示系统以立即彻底关闭启动。这大致相当于按下典型台式计算机上的电源按钮。

两个haltpoweroff通常的符号链接到reboot可执行文件,这通常将调用shutdown使用适当的参数(工具-h-Pr取决于是否)haltpoweroffreboot用于调用该工具。但是,将--force选项传递给时reboot,或者处于运行级别0或6时,rebootreboot()使用适当的命令代码本身调用系统调用。


托马斯,非常感谢您的解释。我有兴趣知道如何执行#init 0,没有太多区别吧?
Win.T 2015年

@ Win.T使用eg /sbin/init 0或切换到运行级别0 /sbin/telinit 0应该与停止系统相同,尽管采取的具体步骤将取决于相关的init系统,例如System-V initupstartsystemd。如果您正在运行RHEL,则将使用systemd。
Thomas Nyman 2015年

4
自我注意:每次有人抱怨神秘的Win32 API调用时,请向他们显示reboot(2)。
immibis

@immibis但是重新启动是故意的。它需要魔术标记,因此很难偶然地做到。
凯文·考克斯

4
@KevinCox这是要求魔术标记的参数。它不是要为magic2接受4个不同的值,也不是在PID名称空间中具有不同的行为,也不是将几个几乎不相关的操作(例如将reboot-on-Ctrl-Alt-Delete行为设置为一个函数)组合到一个函数中。
immibis

1

haltpoweroff并且shutdown -h完全等效。实际上,暂停和关闭电源仅能执行call shutdown -h。从暂停/关机手册页:

如果在系统不在运行级别0或6时调用暂停或重新启动,换句话说,在系统正常运行时,将调用shutdown(使用-h或-r标志)。有关更多信息,请参见shutdown(8)联机帮助页。

然后关机,通过切换到运行级别0,继续关闭系统。

停止和关机(以及重新启动)扮演双重角色;当在关闭过程中(即,运行级别0或6)执行时,它们将执行物理停止,关闭电源或重新引导计算机所需的低级操作,如另一个答案所述。


2
您正在使用哪个版本的RHEL?正常情况下,停止和关闭电源之间会有区别(尽管有一段时间在许多发行版中不是这种情况,但这是一个错误)。
Bruno
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.