我一直在研究 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
;但有警告说:
不鼓励使用
SIGPWR
and 。/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 更改运行级别的正常方法。