udevのイベントから、システムが起動中かどうか調べる

https://ubiregi.com/ja/ex

ユビレジエクステンションというアホみたいな名前のデバイスがありまして(※発案者が言っています)、レシートプリンタをUSBで刺して無線LANiPadからレシート出るようにできるよ! すごい! みたいなやつです*1。あ、ハードウェアはみんな大好きSheevaPlugです。SDカードにDebian入れて動いてるよ。

で、こいつが難しい。画面出ないもんで、動いてるか動いてないかしかわからないので、トラブルシューティングのときすごい困る。起動したかどうかもわからん。で、困ってたんだけど、あるとき気付いて、udevでレシートプリンタが接続された瞬間を検出して、いろいろコマンドを実行して結果をレシートに印刷すれば良い。

ここまでは良いんだけど、udevってシステム起動時にも、活線挿抜時と同じイベントが出るので、ちょっと困ってた。電源入れるたびに、50cmくらいレシート出るとちょっといらっとすると思う。しかも、起動完了してないから、ほとんど意味のない情報だし。

さて、どうやってシステム起動中であることを識別するか。

「runlevelを/etc/rc.localとかで切り替えて、システム起動中かどうか調べる」案

よくわかんないけど、うまくいかなかった

telinitとinitの違いはよくわからんし、ぐぐってみたらOKWaveとかそういう系のがヒットして、しかも「ぐぐれかす」って言われるし。init 4とかやってみたら止まるし。

諦めた。

rcS.d/S00helloとかで/varとかに適当なファイル作って/etc/rc.localとかで消す」案

なんかファイルが作成できない。@haruyamaさんに相談してみたところ、readonlyなんじゃねーの、とか言われて、みてみたらroっぽかった。で、適当にrwなところに書き込もうとしたんだけど、なんか書けない。

/devは書けるだろうなーudevだしなーとか思ったけど上手くいかなくて、困ってls /devとかレシートに出してみたところで気づいた(80cmくらいになったよ!)。なんか、ホットプラグで出てくるやつと、長さが違う。

「/dev/xconsoleとかが起動後に消える」

良く見たら、なんか2個くらいファイルが無くなってるので、そのファイルを見て起動中かどうか調べることにしました。なんでそういうことになってるのかよくわかんないけど、まあ動いてるし良いや。

Kernelのバージョンとか変えるときにはちゃんとテストすること。

まとめ

udevのイベントがfireされたときに、それがシステム起動中かどうかを調べるのは難しかった。

今回は、shutdownされないシステムだったことがさらに難しくした要因だと思う(電源offはコンセントから抜くだけ)。通常はshutdownされることが期待されるシステムなら、起動後にファイルを作って、shutdownでファイルを消すとかで良さそう。

*1:WS-POSってなんすか?