重要的: 如果我这样做,我就能够恢复停止旧的行为:
apt install sysvinit-core
加:老的红帽基于的版本也能够通过停止来关闭电源。
我试图理解为什么在 Debian 9 中你不应该再使用halt 来关闭你的计算机。该行为已从 systemd 中删除。我有点害怕,但我想一定有一个很好的逻辑理由。
其他 Unix 或类 Unix 系统是否具有相同的行为,或者 Linux 是否正在变得不同?
现在,如果您想在系统关闭后关闭机器,您应该使用 poweroff 而不是halt...
有人知道这个命令在其他类 Unix 中是如何解释的吗?
这不是重复的,因为,例如,debian 7 可以通过暂停来关闭电源。
答案1
德班
在 Debian(esque) 系统中使用 SysVinit 时,/etc/defaults/halt
包含一个变量,该变量定义系统在转换到运行级别 0 结束时是否运行暂停或断电。默认设置为HALT=poweroff
。
在 SysVinit 2.74 之前,您不应该直接运行,从该版本开始,除非当前运行级别为 0 或 6,否则halt
SysVinithalt
命令将只调用。这在手册页中有记录。在转换到运行级别 0 结束时,运行级别脚本将运行,默认情况下等于。shutdown -h
halt(8)
$HALT
poweroff
RHEL/CentOS
RHEL/CentOS 5 是最后一个使用 SysVinit 的版本:版本 6 使用upstart
,版本 7 使用systemd
.在 RHEL 5.11 中,转换到运行级别 0 时要运行的最后一个脚本是/etc/init.d/halt
,其最后几行是:
[ "$INIT_HALT" != "HALT" ] && HALTARGS="$HALTARGS -p"
exec $command $HALTARGS
由于相同的脚本也在转换到运行级别 6(重新启动)结束时运行,因此实际运行的命令由变量 定义$command
,并且它将是/sbin/halt
或/sbin/reboot
。根据变量的值$INIT_HALT
,脚本将决定是否添加该-p
选项。该变量由 设定/sbin/shutdown
。 RHEL 5.11shutdown(8)
手册页显示:
停止或断电
-H 选项只是将 init 环境变量 INIT_HALT 设置为 HALT,而 -P 选项只是将该变量设置为 POWEROFF。调用halt(8)作为关闭序列中最后一件事的关闭脚本应该检查这些环境变量,并使用正确的选项调用halt(8),以使这些选项真正产生任何效果。 Debian 3.1 (sarge) 支持这一点。
(是的,RHEL 5.11 手册页提到了 Debian 3.1!我猜 RedHat 的某人将各种来源的补丁移植到 RHEL 时错过了一个参考...)
看来 RedHat 决定在脚本中编写上述测试的代码/etc/init.d/halt
,其中关闭电源(/sbin/halt -p
在关闭结束时使用)是默认的停止操作:实现不关闭电源的停止的唯一方法是使用命令-H
的大写选项shutdown
显式请求它,例如shutdown -hH now
但同样,默认的断电是由 Linux 发行版定制的运行级别脚本触发的,因此它并不是 SysVinithalt
命令的真正功能。
历史记录
旧的使用 SysVinit 的系统(Linux 和非 Linux 系统)曾经有几个不打算直接使用的命令,而只是作为适当的关闭/重新启动脚本的一部分。在 SysVinit 2.74 之前,/sbin/halt
不带选项的命令将执行与halt -f
现代 SysVinit 相同的操作,即残酷地立即关闭内核,而不停止任何服务或卸载文件系统。
出于同样的原因,习惯 Linuxkillall
命令在其他 Unix 上可能会很危险。它的手册页甚至有这个不祥的警告:
请注意,在非 Linux 系统上输入killall name 可能不会产生预期的效果,尤其是由特权用户执行时。
这是因为经典的 SystemVkillall
是设计为仅用作关闭脚本的一部分的命令之一。在带有 SysVinit 的 Linux 发行版中,该命令的经典版本可能为killall5
.它确实杀死了全部除内核线程和其自己会话中的进程之外的进程:其预期用途是在关闭所有服务之后、卸载本地文件系统之前的关闭脚本中,以杀死可能延迟或阻止卸载的任何其他进程。
killall <something>
(你问我怎么知道这一点?嗯,我曾经犯过在 Solaris 2.6 系统上以 root 身份运行的错误。这是一次非常有效的学习经历。)
答案2
这个问题是基于多个谎言。
人们并不用halt
它来关闭计算机,这一点在 systemd 中也没有改变。
halt
又名haltsys
关闭并停止。 poweroff
是一个较新的命令,用于关闭和断电。 (https://unix.stackexchange.com/a/196471/5132解释了其中的微妙之处,我将在这里对其进行掩饰,因为问题仅与 Linux 操作系统有关。本答案仅关注 AT&T System 5 UNIX 方面。)
正如我所解释的https://superuser.com/a/900205/38062, 计算机不一定有能力的在软件控制下关闭电源。haltsys
和命令的操作halt
通常是关闭和停止机器,下一个操作是操作员使用物理重置按钮或电源开关。
halt
获得了-p
/--poweroff
选项以使其等同于poweroff
,但这表明这些命令的重叠和自相矛盾的选项普遍增长。证人halt
Debian 7 中Upstart 命令的手册页。就在halt --poweroff
那里。 halt
Debian 7 中van Smoorenburg 命令的手册页同样有halt -p
.
但是这个不是systemd 改变了一些东西。 systemd 提供了相同的功能。这系统halt
命令 还有--poweroff
。它还具有--reboot
和 (为了更好的衡量)--halt
选项。
我必须做同样的事情nosh 工具集中的halt
/命令haltsys
,为了兼容性。
您可以错误地认为那个普通的旧halt
电脑关闭了你的计算机。但这对于 Upstart 来说显然是错误的,而且仅有的适用于 van Smoorenburg 工具集如果你碰巧遇到了错误。
这个错误直到今年才终于得到修复,即 van Smoorenburghalt
命令会简单地忽略该选项的存在或不存在-p
,而是根据 中的设置值决定是否停止或关闭电源/etc/default/halt
。如果您碰巧将该设置设置为关闭电源,那么halt
即使没有-p
提供任何选项,也会始终关闭电源。相反,如果您碰巧将该设置设置为停止,那么halt
即使-p
提供了选项,也会始终停止。
但这是一个错误,不是记录的或预期的行为,不是 Debian 上可用的每个命令的行为halt
,也不是halt
一般命令的常规行为。
进一步阅读
- 乔纳森·德博因·波拉德 (2018-12-07)。Bug#586709:由 Thomas Goirand 关闭。 Debian 错误#586709。
- 杰西·史密斯(2019-03-08)。initscripts:命令
halt
意外改变的行为。 Debian 错误#743555。