执行任何操作 USE /dev/initctl 或 /run/initctl

执行任何操作 USE /dev/initctl 或 /run/initctl

我一直在研究 Raspberry Pi 的 UPS 代码即使用 sysv init 而不是 systemd (个人喜好和熟悉程度)。我正在研究特权脚本(可能是 /etc/rc.local 的一部分或从 /etc/rc.local 运行)如何告诉 init 有供电系统电子短缺。手册init(8)页告诉我如何将单个大写字母(“F'ailing”、“O'k”或严格的“L”ow)写入“以前”/etc/powerstatus但现在/var/run/powerstatus“然后”发送init信号SIGPWR;但有警告说:

不鼓励使用SIGPWRand 。/etc/powerstatus想要与 init 交互的人应该使用/run/initctl控制通道 - 请参阅 sysvinit 包的源代码以获取有关此内容的更多文档。

我看过来源由 gnu.org 托管,但我还没有看到任何使用此的示例新奇的接口来告诉init事情。

有趣的是,九头蛇systemd确实尝试复制这个界面,因为我认为有些东西不喜欢它不存在,但我还没有找到实际使用它的东西。有这样的事吗?我希望一些 UPS 相关软件能够,例如,nut但我不认为它能......

这个问题虽然提到了“Raspberry Pi”,但并不特定于该平台或在其上运行的 Raspbian 等发行版。

这些问题及其答案对于填写一些相关细节很有启发:

编辑:至少上面的问答之一也表明了为什么有些人有 /dev/initctl 而其他人有 /run/initctl - 这是我没有意识到的(这是 Debian 的事情)。

答案1

我相信reboot用它。执行以下strace操作之一reboot

# strace -s 128 -f reboot

我在底部某处看到:

open("/dev/initctl", O_WRONLY)          = 3
write(3, "i\31\t\3\6\0\0\0\0\0\0\0\0\0\0\0INIT_HALT\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 384) = 384
close(3)

...

open("/dev/initctl", O_WRONLY)          = 3
write(3, "i\31\t\3\1\0\0\0006\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 384) = 384
close(3)

答案2

在 Debian 上,以下软件包使用 /run/initctl:systemd、libvirt、sysvinit、refpolicy、gradm2。 (从https://codesearch.debian.net/)。

我认为这是告诉 init 更改运行级别的正常方法。

相关内容