私はRaspberry PiのUPSのコードを調査しています systemdではなくsysv initを使用しています(個人的な好みと親しみやすさ)。特権スクリプト(おそらく/etc/rc.localの一部または/etc/rc.localから実行)が、電源システムに電子が不足していることをinitにどのように伝えるかを調べていました。 init(8)
のマニュアルページでは、以前は/etc/powerstatus
でしたが、現在は/var/run/powerstatus
と次に、init
SIGPWR
シグナルを送信します。しかし、次のような警告があります。
SIGPWR
および/etc/powerstatus
の使用はお勧めしません。 initを操作したい人は、/run/initctl
制御チャネルを使用する必要があります。これに関する詳細なドキュメントについては、sysvinitパッケージのソースコードを参照してください。
Gnu.orgによってホストされている source を見てきましたが、これnew fangledを使用した例は見ていません。 )init
のことを伝えるためのインターフェース。
興味深いことに、systemd
であるヒュドラーは、このインターフェイスを複製しようとします。これは、何かが存在しないことを好まないと思うのですが、実際にそれを使用するものは見つかりませんでした。そんなことはありますか? UPS関連のソフトウェアの中には、 nut
でも、そうは思わない...
この質問は、「Raspberry Pi」に言及しているものの、そのプラットフォームまたはその上で実行されるRaspbianのようなディストリビューションに固有のものではありません。
これらの質問とその回答は、いくつかの関連する詳細を記入する上で非常に啓発的でした。
編集:上記のQ&Aの少なくとも1つは、一部の人が/ dev/initctlを持っている理由と他の人が/ run/initctlを持っている理由も示しています-これは私が気付いていなかったものです(Debianのものでした)。
Debianでは、次のパッケージが/ run/initctlを使用します:systemd、libvirt、sysvinit、refpolicy、gradm2。 ( https://codesearch.debian.net/ から)。
ランレベルを変更するようにinitに指示するのは通常の方法だと思います。
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)