使用 update-rc.d 创建仅关闭脚本

使用 update-rc.d 创建仅关闭脚本

我有一个运行标准 Raspbian 发行版的 Raspberry PI。我有一个小 C 程序,需要在关闭序列的最后运行。它所做的只是在 GIPO 输出上向电源发送几个逻辑高脉冲,告诉它切断 Raspberry 板的电源。当且仅当系统关闭时才应调用关闭脚本,而不是在 PI 重新引导或启动时调用。

我一直在尝试使用 update-rc.d 来执行此操作,但未能成功。我理解 update-rc.d 文档的方式是:

  1. 复制我的可执行文件 ( 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
    
  2. poweroff创建一个在 /etc/init.d 中调用的脚本

  3. 运行命令 sudo update-rc.d poweroff stop 99 0

这将产生一个脚本:当且仅当系统停止时它将/etc/rc0.d/K99poweroff调用。/sbin/poweroff.bin

我有三个问题:

  1. 每当我运行它时,只会创建sudo update-rc.d poweroff stop 99 0 .一个名为的脚本。/etc/rc0.d/K01poweroff我究竟做错了什么? 99怎么了?
  2. 运行级别 0 期间启动和停止选项的意义是什么?这个脚本应该是K99还是S99?运行级别 0 的启动脚本似乎没什么意义。
  3. 运行级别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. 关闭脚本向后编号,因此它们将以相反的顺序运行,因此您可能需要 1 而不是 99。
  2. 从某些角度来看,如果您愿意,您可以在运行级别 0 中启动服务,但您并不真正愿意。 (虽然您可以将脚本作为开始运行,但我不记得哪个首先运行启动或停止脚本。)由于在运行级别 0 中调用的大多数脚本也在其他运行级别中使用,因此您只想停止它们。 Snn 脚本在运行级别 0 中启动并调用。
  3. 是的,不是。或者在自动电源管理之前更详细地说,运行级别 0 只是另一个运行级别。关机时您看到的最后一件事是提示打开电源开关。如果此时您可以发出运行级别更改的信号,则可能可以使系统恢复。在具有完全电源管理的计算机上,计算机将在达到运行级别 0 的最后一步关闭电源。运行级别 6 类似,但它是一个单独的运行级别,没有在运行级别 0 和 6 之间切换的标准用例。(可以有一个发行版使用运行级别 0 和 6 进行常规使用,并将关闭、重新启动降级到其他运行级别。)

相关内容