障害報告: CACHE_DIR 消失によるカーチャンク応答不能(RemoveIPC 事象)
概要
一般ユーザーで動作するデーモンが /dev/shm(POSIX 共有メモリ)にキャッシュディレクトリを作って動く構成では、systemd-logind の RemoveIPC 機能によって、そのユーザーの最後のログインセッションが終了した瞬間にキャッシュディレクトリごと一掃されることがあります。DVSwitch ボットではこの結果、カーチャンク応答の生成が全数失敗する事象が確認されています。本記事はこの事象の注意喚起と、対策を組み込んだ新バージョンへのアップデート案内です。
時報・30分案内・定時メッセージ・ナイトモードは /dev/shm 直下の別ファイルを使うため影響を受けず、カーチャンク応答のみが失敗する点が特徴です。「起動から数日は正常、ある時点を境に突然壊れる」という現れ方をします。
前提条件
- DVSwitch ボット(
dvswitch_bot.py)を一般ユーザー実行のサービス(例:User=ocv)として運用している - OS が Debian 系で、
RemoveIPCが既定の有効(yes)のまま - キャッシュを
/dev/shm配下(tmpfs)に置く構成 - 対象ユーザーの Linger が無効(
loginctl user-statusでLinger: no)
症状
カーチャンク応答の生成が全て失敗し、ログには次のような出力が現れます。
sox FAIL formats: can't open output file `/dev/shm/ocv_reply_cache_/ .building.wav': No such file or directory [!!] SoX failed rc=2 [!!] Precache failed [!!] Gen failed hybrid audio
キャッシュディレクトリ /dev/shm/ocv_reply_cache_ が消えているために、応答音声ファイルを書き出せずに失敗します。
原因
systemd-logind の RemoveIPC 機能です(/etc/systemd/logind.conf で #RemoveIPC=yes がコメントアウトされ、既定値 yes が有効)。
- logind は、あるユーザーの最後のログインセッションが終了した時点で、そのユーザー所有の IPC オブジェクトを削除します。
/dev/shm配下の当該ユーザー所有ファイル・ディレクトリも削除対象に含まれます - systemd サービスは「ログインセッション」に数えられないため、ボットが稼働中でも保護されません
- Linger が無効だと削除条件が成立します。長時間開いていた SSH セッションを閉じた直後などに発生します
/dev/shm を使うデーモン全般に共通します。対策の手順
1. システム側(本質対策)
対象ユーザーの Linger を有効化します。Linger 有効ユーザーは RemoveIPC の削除対象外になります。
sudo loginctl enable-linger
設定は永続(リブート後も維持)です。
2. ボット側(多層防御・V1.95)
dvswitch_bot.py V1.95 では、_ensure_cached() の入口(カーチャンク応答と Precache の両パスが通る共通点)で毎回 os.makedirs(CACHE_DIR, exist_ok=True) を実行する自己修復を追加しました。tmpfs への makedirs は存在確認のみで済むためレイテンシ影響はありません。万一ディレクトリを作成できない場合は、非キャッシュ経路(毎回生成)に退避し、応答自体は継続します。
enable-linger と、ボット側 V1.95 の自己修復により、実機カーチャンクで正常フロー(Precache ready → Cached → Sending → Complete)を確認しています。3. アップデートのお願い
一般ユーザー実行のサービスが /dev/shm を使う構成のノードでは、この事象が起こり得ます。V1.95 へのアップデートと、システム側の enable-linger 設定の二段構えの適用をお願いします。新規セットアップ時も両方を標準手順に組み込んでください。
確認
Linger が有効になっているか確認します。
loginctl user-status
期待する出力(該当行)は次のとおりです。
Linger: yes
実機でカーチャンクを送出し、応答音声が正常に返ることを確認してください。
トラブルシュート
- カーチャンクだけが失敗し時報・定時メッセージが正常なら、本事象(CACHE_DIR 消失)を強く疑います
- 応急処置として、現行プロセスのキャッシュディレクトリを再作成します:
mkdir -p /dev/shm/ocv_reply_cache_(ただし恒久対策は enable-linger と V1.95) - 再発する場合は Linger 設定(
Linger: yes)とボットのバージョンが V1.95 になっているかを再確認します
まとめ
/dev/shm を使うデーモンは、(1) loginctl enable-linger(または RemoveIPC=no)、(2) 書き込み直前のディレクトリ自己修復(V1.95)、の二段構えを標準としてください。該当ノードの管理者は、早めのアップデートをお願いします。
🏛 JJ2YYK あいちデジタルコミュニケーションハムクラブ