日報 2025.06.20
今日は荷物の搬入があるのでエリート在宅勤務です。始業8分前に起きても出勤可能。
こんな良い制度を無くていこうという方針はどう考えてもDo be Evil。テレワーク出来る業種なのにしてない会社は反省してください。
午前中に引っ越し業者より嫁はんの弟さんの荷物が搬入されて無事に引っ越し完了。
エリート引っ越し祝い飯。ワシが喰いたかっただけや。

見事に部屋が完成している。この家で一番綺麗な部屋ちゃうか?というかいつの間にか我が家も4人住まいとなりおわいハウス化の機運高まってきた…。

エリート在宅勤務は正直捗りすぎるので時間間隔が無くなる前にキリの良いところで無能退勤。
無能退勤で光が見えない。
珍しく早く無能退社した嫁はんを単コロでピックアップしにいくついでに未開拓のカレー屋をデバッグ。
エリート飯。#カレーデバッグ
キーマが想像より香辛料が効いてて一発目でむせる。あいがけのココナティーカレーと混ぜて喰うとミクスチャーで禿げウマで、OC。

炭火焼きの店の間借りっぽくて炭火焼鳥も注文できるようなのでおまかせセットも追加。
めちゃんこ旨い。初めて焼いたレバーを旨いと感じました…。家でミニ七輪でちまちま焼き鳥する機運高まってきた…。


またもや止まる電光表札。本腰を入れて…いやぼちぼちデバッグしていこうと思います。

十中八九サーマルシャットダウンだと思うので、シャットダウン寸前のラズパイのCPU温度をロギングしましょう。微妙にwifiがつながらない場合がある位置にあるのでテレメトリではなくローカルでロギングしていきます。
温度は vcgencmd measure_temp
で取れるので1日分をローテーションでログ保存するスクリプトを書き、cronで1分間隔で実行させておく。停止したら次回起動時に停止寸前の時間と温度がわかる。
ついでい60FPSギリギリのパフォーマンスなので効果あるがわからんが、初代ラズパイZeroWはシングルコアCPUなのでwhileループに100μ秒ほどsleepを入れておく。
あとは本件の停止するやつとは関係無いけど、本プログラムはsystemdサービス経由で実行してるが、systemctl stop serviceしたときに毎回終了シグナルが正常に受け付けられなくてタイムアウトで強制終了するまで待機しないといけない事が判明。
stopで即終了してほしいけど、stop実行時のサービスログを見るとsigHandler: Unhandled signal 18, terminating
との表記がある。signal18はハンドリングされてない感じ?
Linuxシグナルを確認すると 18 は “SIGCONT” でどうも stop時に来てほしいようなシグナルではない、理想は15 “SIGTERM”。
stop時にSIGTERMが来るようにするにはservice定義ファイルに以下を書けばstop時にSIGTERMが来るようになった。
1 2 3 |
[Service] ... ExecStop=/bin/kill -15 $MAINPID |
再度stopさせると、sigHandler: Unhandled signal 15, terminating
と、ハンドリングされてない状況自体は変わらず。
全く持って完全に不明なので perplexity に雑に “sigHandler: Unhandled signal 15, terminatingの解決方法”と聞いたら、「pigpioなどの一部ライブラリでは独自にシグナルハンドラーを設定している場合があり、ユーザーのハンドラーが呼ばれないことがあります。この場合は、ライブラリの設定やドキュメントを確認し、必要に応じてライブラリのシグナルハンドリングを無効化する方法(例:gpioCfgSetInternals()の利用)を検討してください。」と言われて本当にエスパーじみてて恐怖すら覚えるほどの答えが帰ってきて椅子から転げ落ちる。
なぜエスパーと感じたかですが、本プログラムはGPIOの制御にまさにpigpioライブラリを使っていて、ラズパイを使っている事もpigpioも使っている事も一切伝えてない。ヤバすぎる。
…と思ったけど “sigHandler”のログってもしかして pigpio が出してるんか?
気になってpigpioのソースコードチェック…普通にあるやんけ。
1 |
DBG(DBG_ALWAYS, "Unhandled signal %d, terminating\n", signum); |
ということで人間がその気になれば普通に解決できたしエスパーでもなんでもありませんでした。
あ、シグナルのハンドル自体はgpioCfgSetInternals
()使ってpigpioのシグナルハンドルを無効にしたら普通にSIGTERMシグナルをハンドルできるようになってstopで即サービス終了できました。よかったですね。
gpioCfgSetInternals(gpioCfgGetInternals() | PI_CFG_NOSIGHANDLER);
おわい
ラズパイ別個体に変えても症状変わらんか試してみたいところ。