Debian 9 停止在新版本中并没有真正关闭 - 为什么?

Luc*_*ini 2 debian halt

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

apt install sysvinit-core  
Run Code Online (Sandbox Code Playgroud)

另外:旧的基于Red Hat的版本也可以在停止时关闭电源。

我试图理解为什么在 Debian 9 中你不应该再使用暂停来关闭你的计算机。该行为已从 systemd 中删除。我有点害怕,但我认为一定有一个很好的逻辑理由。

其他 Unix 或类 Unix 是否具有相同的行为,还是 Linux 正在变成不同的东西?

现在如果你想在系统关闭后关闭机器,你应该使用 poweroff 而不是halt...

有人知道这个命令在其他 Unix-Like 中是如何解释的吗?

这不是重复的,因为,例如,debian 7 可以通过暂停来关闭电源。

tel*_*coM 6

Debian

在 Debian(esque) 系统中使用 SysVinit 时,/etc/defaults/halt包含一个变量,该变量定义系统在过渡到运行级别 0 结束时是暂停还是关机。默认设置为HALT=poweroff

在 SysVinit 2.74 之前,您不应该halt直接运行,并且从该版本开始,除非当前运行级别为 0 或 6,否则SysVinithalt命令将只会调用shutdown -h。这在halt(8)手册页中有记录。在过渡到运行级别 0 结束时,运行级别脚本将运行$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
Run Code Online (Sandbox Code Playgroud)

由于在过渡到运行级别 6(重新启动)结束时也会运行相同的脚本,因此要运行的实际命令由变量 定义$command,它将是/sbin/halt/sbin/reboot$INIT_HALT脚本会根据变量的值来决定是否添加该-p选项。该变量由/sbin/shutdown. RHEL 5.11shutdown(8)手册页说:

暂停或关机

-H 选项只是将初始化环境变量 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所做的一样,即在不停止任何服务或卸载文件系统的情况下直接关闭内核。

出于同样的原因,killall在其他 Unix 上习惯使用 Linux命令可能是危险的。它的手册页甚至有这个不祥的警告:

请注意,在非 Linux 系统上键入 killall name 可能不会产生预期的效果,尤其是当由特权用户完成时。

这是因为经典的 SystemVkillall是设计为仅用作关闭脚本一部分的命令之一。在带有 SysVinit 的 Linux 发行版中,该命令的经典版本可能是killall5. 它实际上杀死除内核线程和自己会话中的进程之外的所有进程:它的预期用途是在关闭所有服务之后,就在卸载本地文件系统之前,在关闭脚本中杀死可能延迟或阻止卸载的任何其他进程。

(你问我是怎么知道的?嗯,我曾经犯过killall <something>在 Solaris 2.6 系统上以 root 身份运行的错误。非常有效的学习经验。)