ユーザがログインしてログアウトすると、そのユーザの作ったmqueueが消える - 揮発性のメモ2

揮発性のメモ2

知識をメモ書きしておく

ユーザがログインしてログアウトすると、そのユーザの作ったmqueueが消える

systemdの設定で RemoveIPC とかいう機能がデフォルトで有効になっていて、そのユーザーのセッションがすべてログアウトされるとそのユーザーが使用していたIPCリソースがすべて消える というとんでもない仕様。
共有メモリ、セマフォ、メッセージキュー とか。POSIX も System V もどっちもアウト。

この仕様のおそろしいところ

あるユーザ権限で起動しているサービスがメッセージキュー等を使っているとき、そのユーザがログインして作業してログアウトすると 動かなくなる。
びっくりしてシステムを再起動すると動作は正常に戻る。
しかし、遠隔ログインして状況を確認し うん大丈夫 と安心してログアウトするとまた死ぬ。
かといって調査を放棄しログインしなくなれば問題なく動作し続けるので、本当にキツネにつままれた気分になる


もともとは、GUI環境とかでユーザーがデスクトップからログアウトするとかしてセッションが全部なくなった時に 残ったリソースを全部掃除するのが目的のオプションらしい。

こう直して再起動することで回避できる

/etc/systemd/logind.conf
[Login]
#RemoveIPC=yes
RemoveIPC=no
systemctl restart systemd-logind.service


セッションがどんな感じで残ってるかは次のコマンドで確認できる

# loginctl list-sessions
SESSION  UID USER     SEAT  TTY
     49 1000 chinko         pts/0
     50 1000 chinko         pts/1
     52 1000 chinko         pts/2
     53    0 root     seat0 tty1

たとえばこんなんなってる場合、chinkoユーザーは全部で3か所からログインしてるとわかる
(Teraterm3枚開いてるとか)

セッションの情報は次のコマンドで取得できる

# loginctl show-session 49
Id=49
User=1000
Name=chinko
Timestamp=Tue 2024-10-01 13:27:33 JST
TimestampMonotonic=42751255824
VTNr=0
TTY=pts/0
Remote=yes
RemoteHost=192.168.1.201
Service=sshd
Scope=session-49.scope
Leader=2704
Audit=49
Type=tty
Class=user
Active=yes
State=active
IdleHint=no
IdleSinceHint=1727757225461814
IdleSinceHintMonotonic=43123339976
LockedHint=no
Id セッションID
User ユーザーUD
Name ログインID
Timestamp ログインした日時
Leader このセッションの親のPID

参考:
Apache が AH00144 で落ちる件 - (ひ)メモ
systemdにRemoveIPC=yesが構成されている場合にデータベースのインストールおよび操作が失敗する
18.4. カーネルリソースの管理
logind.conf(5) — systemd — Debian bookworm — Debian Manpages