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

Win*_*n.T 78 shutdown rhel

阅读“Halt 和 Shutdown 命令有什么区别?” ,我通常知道命令 shutdown 有什么作用,有或没有 -h/-r 选项。

“halt”命令执行系统断电到系统的运行级别 0。

“shutdown”命令在不使用 -h 或 -r 命令的情况下将系统断电至运行级别 1。

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

Jde*_*eBP 148

现在,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、upstart、nosh、van Smoorenburginit和 BSDinit都有自己的halt,poweroff等等。他们的机制略有不同。他们的手册页也是如此。

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

目标,而不是运行级别

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

bootupsystemd 工具集中(7) 手册页上的图表,尤其是最后一个,显示这里有三个相关的“最终”目标:

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

这些是您应该在最终系统状态而不是运行级别时考虑的事情。从图中注意 systemd 目标系统本身编码的东西在其他系统中是隐式而非显式的:例如这些最终目标中的每一个都包含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程序内部的相同代码路径中。

笔记:

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

进一步阅读


Tho*_*man 26

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

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

两个haltpoweroff通常的符号链接到reboot可执行文件,它通常会调用shutdown使用适当的参数(工具-h-Pr),这取决于是否haltpoweroffreboot用于调用该工具。However, When the --forceoption is passed to reboot, or when in runlevel 0 or 6, rebootwill invoke the reboot()system call with an appropriate command code itself.

  • 自我注意:每次有人抱怨神秘的 Win32 API 调用时,向他们展示 reboot(2)。 (4认同)
  • @KevinCox 这就是需要魔术标志的论据。这不是为 magic2 接受 4 个不同值的论据,也不是在 PID 命名空间内表现不同的论据,也不是将几个几乎不相关的操作(如设置重启-Ctrl-Alt-Delete 行为)集中到一个函数中的论据。 (4认同)