我有一个运行标准 Raspbian 发行版的 Raspberry PI。我有一个小 C 程序,需要在关闭序列的最后运行。它所做的只是在 GIPO 输出上向电源发送几个逻辑高脉冲,告诉它切断 Raspberry 板的电源。当且仅当系统关闭时才应调用关闭脚本,而不是在 PI 重新引导或启动时调用。
我一直在尝试使用 update-rc.d 来执行此操作,但未能成功。我理解 update-rc.d 文档的方式是:
复制我的可执行文件 (
poweroff.bin
),将其复制到 /sbin 并为其提供所需的权限和 LSB 标头:#!/bin/sh ### BEGIN INIT INFO # Provides: poweroff # Required-Start: # Required-Stop: $all # Default-Start: # Default-Stop: 0 # Short-Description: Power off. # Description: Send a power off signal to the PM board. # X-Interactive: false ### END INIT INFO /sbin/poweroff.bin exit 0
poweroff
创建一个在 /etc/init.d 中调用的脚本- 运行命令 sudo update-rc.d
poweroff stop 99 0
。
这将产生一个脚本:当且仅当系统停止时它将/etc/rc0.d/K99poweroff
调用。/sbin/poweroff.bin
我有三个问题:
- 每当我运行它时,只会创建
sudo update-rc.d poweroff stop 99 0 .
一个名为的脚本。/etc/rc0.d/K01poweroff
我究竟做错了什么? 99怎么了? - 运行级别 0 期间启动和停止选项的意义是什么?这个脚本应该是K99还是S99?运行级别 0 的启动脚本似乎没什么意义。
- 运行级别0仅在关机时使用吗?即,如果我执行“shutdown -r now”,计算机是否会被发送到运行级别 0,然后返回到运行级别 6?
答案1
基于依赖关系的元初始化系统会忽略请求的编号。您提供的内容有误!关键线索来自另一个脚本。让我们看一下umountroot
:
### BEGIN INIT INFO
# Provides: umountroot
# Required-Start:
# Required-Stop:
# Should-Stop: halt reboot kexec
# Default-Start:
# Default-Stop: 0 6
# Short-Description: Mount the root filesystem read-only.
### END INIT INFO
让我们仔细看看这条Should-Stop
线。请注意,它取决于停止,而不是断电。通过查看 debian 的暂停脚本,我们可以明确地看到这一点:
### BEGIN INIT INFO
# Provides: halt
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop: 0
# Short-Description: Execute the halt command.
# Description:
### END INIT INFO
请注意,更新脚本仍然不会将其称为 K99,但可能会将其称为 K15 之类的名称,除非您有一组非常复杂的依赖项。但如果你改变你的提供线停止,它应该工作。
答案2
- 关闭脚本向后编号,因此它们将以相反的顺序运行,因此您可能需要 1 而不是 99。
- 从某些角度来看,如果您愿意,您可以在运行级别 0 中启动服务,但您并不真正愿意。 (虽然您可以将脚本作为开始运行,但我不记得哪个首先运行启动或停止脚本。)由于在运行级别 0 中调用的大多数脚本也在其他运行级别中使用,因此您只想停止它们。 Snn 脚本在运行级别 0 中启动并调用。
- 是的,不是。或者在自动电源管理之前更详细地说,运行级别 0 只是另一个运行级别。关机时您看到的最后一件事是提示打开电源开关。如果此时您可以发出运行级别更改的信号,则可能可以使系统恢复。在具有完全电源管理的计算机上,计算机将在达到运行级别 0 的最后一步关闭电源。运行级别 6 类似,但它是一个单独的运行级别,没有在运行级别 0 和 6 之间切换的标准用例。(可以有一个发行版使用运行级别 0 和 6 进行常规使用,并将关闭、重新启动降级到其他运行级别。)