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

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

阅读“停止和关闭命令之间有什么区别?”,我通常知道命令 shutdown 的作用,无论是否带有 -h/-r 选项。

“halt”命令将系统断电至系统运行级别 0。

“shutdown”命令将系统电源关闭到运行级别 1,无需使用 -h 或 -r 命令。

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

答案1

现在,systemd 给出了答案。

根据您问题的标签,您正在使用 Red Hat Enterprise Linux。从版本 7 开始,就使用了 systemd。对于 systemd 的世界来说,其他答案都不正确;你的问题中的一些假设也不是。

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

每个系统管理工具集都有自己的这些实用程序版本。 systemd,新贵,开胃菜、van Smoorenburginit和 BSDinit都有自己的haltpoweroff、等等。他们的机制略有不同。他们的手册页也是如此。

在 systemd 工具集中halt, poweroff,reboot,telinit, 和shutdown全部符号链接到/bin/systemctl.他们是全部向后兼容垫片,它们只是调用 systemd 的主要命令行界面的简写:systemctl。它们都映射到(事实上是)相同的单身的程序。 (按照惯例,shell 会告诉它是用哪个名称调用的。)

目标,而不是运行级别

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

systemd 工具集中第 (7) 手册页上的图表bootup(特别是最后一张图表)显示了与此处相关的三个“最终”目标:

  • halt.target— 一旦系统达到完全隔离该目标的状态,它将调用reboot(RB_HALT_SYSTEM)系统调用。内核将尝试进入 ROM 监控程序,或者只是停止 CPU(使用任何适合这样做的机制)。
  • reboot.target— 一旦系统达到完全隔离该目标的状态,它将调用reboot(RB_AUTOBOOT)系统调用(或与魔法命令行等效的功能)。内核将尝试触发重新启动。
  • poweroff.target— 一旦系统达到完全隔离该目标的状态,它将调用reboot(RB_POWER_OFF)系统调用。如果可能的话,内核将尝试切断系统电源。

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

systemctl尝试发送请求至systemd-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 没有 a 的概念当前运行级别。这些命令的操作不以任何“如果您处于运行级别”为条件”。
  • 、、 和命令--force的选项与、、 和命令的选项相同。这使得尝试直接调用。通常它只是试图隔离目标。haltrebootpoweroff--force --forcesystemctl haltsystemctl rebootsystemctl poweroffsystemctlreboot()
  • telinit不等于init.它们是 systemd 世界中的不同程序,后者是程序的别称systemd,而不是systemctl程序的名称。该systemd程序根本不需要与任何 van Smoorenburg 兼容性进行编译,并且在某些 systemd 操作系统上,如果尝试的话,就会抱怨被错误地调用。init N

进一步阅读

答案2

  • halt指示硬件停止所有CPU功能,但使其处于通电状态。这通常意味着有人必须随后按下电源按钮来手动重新启动或关闭机器。实现这一点的具体方法是特定于体系结构的,但例如 x86 指令集提供了HLT暂停中央处理单元(CPU)直到触发下一个外部中断的指令。

  • poweroff,例如halt,停止CPU但也发送一个ACPI硬件信号将指示系统开始完全立即关闭。这大致相当于按下典型台式计算机上的电源按钮。

halt和通常poweroff都是可执行文件的符号链接reboot,通常会调用shutdown具有适当参数(-h-Pr)的工具,具体取决于 if haltpoweroffreboot用于调用该工具。但是,当--force选项传递给 时reboot,或者处于运行级别 0 或 6 时,reboot将调用reboot()系统调用本身带有适当的命令代码。

答案3

haltpoweroff并且shutdown -h完全等价。事实上,halt 和 poweroff 除了调用 之外什么也不做shutdown -h。从停止/断电联机帮助页:

如果在系统不处于运行级别 0 或 6 时(换句话说,当系统正常运行时)调用halt 或reboot,则将调用shutdown(使用-h 或-r 标志)。有关详细信息,请参阅 shutdown(8) 联机帮助页。

然后 Shutdown 会切换到运行级别 0 来关闭系统。

停止和关闭电源(以及重新启动)具有双重作用;当在关闭过程中执行时(即在运行级别 0 或 6 中),它们执行物理停止、关闭电源或重新启动机器所需的低级操作,如另一个答案中所述。

相关内容