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