🪄 ホットスポット安定化の魔法 ― 第七の魔法(最終話) ― 後始末の魔法
後始末の魔法 ― 残された呪物を必ず祓う

魔法シリーズ、最後の第七の魔法。派手さはないけれど、長く動かすほどジワジワ効いてくる「後始末」の話です。
かかっていた呪い
dvswitch_bot.py は音声応答を編むとき、一時的な WAV ファイルを /dev/shm(メモリ上の tmpfs)に置きます。詠唱が正しく終われば祓うのですが、例外が出たときに呪物が残ることがありました。さらに使い魔が倒れて起き直した後には、前回の古い PID ファイルの残骸が残ることも。/dev/shm はメモリです。Pi Zero のように RAM の乏しい機種では、呪物が積もるとそれなりに効いてきます。
呪いを追う
一時ファイルを祓う呪文を、詠唱の「最後の一行」で普通に唱えていたのが問題でした。
# 旧き呪文:途中で例外が出ると祓いに到達しない
tmp = "/dev/shm/reply_001.wav"
make_wav(tmp)
send_to_usrp(tmp) # ここで例外が出ると…
os.remove(tmp) # → ここまで来ないので祓われず残る途中の make_wav や send_to_usrp が転ぶと、os.remove まで辿り着けません。例外が出る = まさに祓いが要る場面なのに、その時だけ祓いが飛ばされる、という最悪の挙動でした。
呪いの正体
「正常に最後まで進めば祓える」という前提の後始末。 異常終了の道筋を考えていませんでした。加えて起動時に過去の呪物を祓う術がなく、倒れる→起き直すたびに残骸が積み増しされる恐れがありました。
解呪の魔法
祓いを try/finally の結界へ移し、成功しても失敗しても必ず祓うようにしました。
# 新しき魔法:finally で必ず祓う
tmp = "/dev/shm/reply_001.wav"
try:
make_wav(tmp)
send_to_usrp(tmp)
finally:
if os.path.exists(tmp):
os.remove(tmp) # 例外が出ても必ず通るあわせて、起動時に古い一時ファイルと死んだ PID ファイルの残骸を祓う呪文を加えました。倒れた後の起き直しでも、清浄な状態から始められます。
# 起き直しの祓い:過去の呪物を一掃する
for junk in glob.glob("/dev/shm/reply_*.wav"):
try:
os.remove(junk)
except OSError:
pass
# 死んだ PID ファイルも同様に検めて祓うこれらを v1.48 に封じ込めました。
魔導書に記す
後始末は「異常時にこそ発動する」場所に宿す。 リソースの解放・一時ファイルの祓いは、正常系の最後ではなく try/finally(あるいは with)へ。そして長く動かすものは、起き直しのたびに前回の呪物を祓う一手間が効きます。「いつか誰かが手で祓う」は、24時間動く使い魔では成立しません。
全七話、TGIFChanger-Py と dvswitch_bot.py の安定化で解いてきた呪いを振り返りました。括ると魔法は二系統 ― 子プロセスを召喚せず DMR ネットへの干渉を断つ呪文と、ログ追従・分身・不死の結界・後始末で長時間運用に耐える殻を編む呪文でした。同じホットスポット環境で使い魔を育てる方の魔導書に、何か一行でも書き写してもらえたら幸いです。 73!
📝 執筆:JJ2TAB(尾張旭 DMR デジピーター 管理人)
🏛 JJ2YYK あいちデジタルコミュニケーションハムクラブ
◀ 前へ:第六の魔法 ― 不死の魔法 | 🪄 魔法シリーズ一覧