这个问题是基于多个谎言。

这个问题是基于多个谎言。

重要的: 如果我这样做,我就能够恢复停止旧的行为:

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,否则haltSysVinithalt命令将只调用。这在手册页中有记录。在转换到运行级别 0 结束时,运行级别脚本将运行,默认情况下等于。shutdown -hhalt(8)$HALTpoweroff

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,但这表明这些命令的重叠和自相矛盾的选项普遍增长。证人haltDebian 7 中Upstart 命令的手册页。就在halt --poweroff那里。 haltDebian 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一般命令的常规行为。

进一步阅读

相关内容