阅读“Halt 和 Shutdown 命令有什么区别?” ,我通常知道命令 shutdown 有什么作用,有或没有 -h/-r 选项。
“halt”命令执行系统断电到系统的运行级别 0。
“shutdown”命令在不使用 -h 或 -r 命令的情况下将系统断电至运行级别 1。
命令 "poweroff" 进入运行级别 0 或 1 怎么样?这是这三个命令之间唯一的主要区别吗?
Jde*_*eBP 148
根据您问题的标签,您正在使用 Red Hat Enterprise Linux。从第 7 版开始,就使用了 systemd。对于 systemd 的世界,其他答案都不正确;你的问题中的一些假设甚至也不是。
halt来自 van Smoorenburg“System 5”init实用程序的命令。 /sbin/halt作为符号链接的语句/sbin/reboot;systemd 并非如此。根本没有单独的reboot程序。 halt或reboot调用shutdown与命令行参数程序; systemd 也不是这样。根本没有单独的shutdown程序。每个系统管理工具集都有这些实用程序的版本。systemd、upstart、nosh、van Smoorenburginit和 BSDinit都有自己的halt,poweroff等等。他们的机制略有不同。他们的手册页也是如此。
在systemd工具集halt,poweroff,reboot,telinit,和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 nowsystemctl halthaltsystemctl isolate reboot.target 有简写:
shutdown -r nowtelinit 6systemctl rebootrebootsystemctl isolate poweroff.target 有简写:
shutdown -P nowtelinit 0shutdown nowsystemctl poweroffpoweroffsystemctl isolate rescue.target 有简写:
telinit 1 systemctl rescuesystemctl isolate multi-user.target 有简写:
telinit 2telinit 3telinit 4systemctl isolate graphical.target 有简写:
telinit 5在解析了各种不同的命令行语法之后,这些最终都会出现在systemctl程序内部的相同代码路径中。
笔记:
shutdown now切换到单用户模式。这不是 systemd 的情况。 rescue.target—在 systemd 中将单用户模式重命名为救援模式— 无法通过该shutdown命令访问。telinit 确实完全忽略了手册页描述的文件系统中的所有这些和符号链接。上述映射被硬连线到程序中,在一个表中。runlevelN.targetdefault.targetsystemctl--force选项的halt,reboot和poweroff命令是一样的话说--force --force到systemctl halt,systemctl reboot和systemctl poweroff命令。这使得systemctl尝试reboot()直接调用。通常它只是尝试隔离目标。telinit不一样init。它们是 systemd 世界中的不同程序,后者是systemd程序的另一个名称,而不是systemctl程序的名称。该systemd程序不一定与任何 van Smoorenburg 兼容编译,并且在某些 systemd 操作系统上抱怨如果尝试调用会被错误地调用。init Nsystemctl. systemd 手册页。freedesktop.org。systemd.special. systemd 手册页。freedesktop.org。bootup. systemd 手册页。freedesktop.org。init. 小吃指南。软件。Tho*_*man 26
halt指示硬件停止所有 CPU 功能,但使其处于通电状态。这通常意味着有人必须在之后按下电源按钮手动重新启动或关闭机器。实现这一点的具体方法是特定于体系结构的,但例如 x86 指令集提供了HLT暂停中央处理单元 (CPU) 直到触发下一个外部中断的指令。
poweroff,如halt,停止 CPU,但也会发送一个ACPI硬件信号,该信号将指示系统开始完全和立即关闭。这大致相当于按下典型台式计算机上的电源按钮。
两个halt和poweroff通常的符号链接到reboot可执行文件,它通常会调用shutdown使用适当的参数(工具-h,-P或r),这取决于是否halt,poweroff或reboot用于调用该工具。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.