kkAyatakaのメモ帳。

誰かの役に立つかもしれない備忘録。

loginctlでGUIセッションの情報を取得する

LinuxGUI表示中のユーザーかどうか(セッションがアクティブかどうか)を調べる方法がないかと調べて行ったらloginctlに行き着いた。Linuxの(というかsystemdのか?)セッションに詳しくないのでフレーズの使い方が微妙なんだけど、概ね必要な情報は取れてたのでまとめておく。

  • loginctl list-sessionsGUIログイン中のセッションリストを取得できる
  • loginctl show-session [ID...]で指定したセッションの詳細が表示できる
  • /run/systemd/sessions/以下のファイルからshow-sessionの情報が取得できる
    • が、「# This is private data. Do not parse.」

systemdのAPIを触ってみた話はこちら。

環境

  • CentOS 7.6.1810
  • systemd 219 (loginctl --version)

systemdに依存しているので、systemdのシステムなら通じるはず。逆にsystemdではないシステムでは全く通じない。

system-logindのloginctlコマンド

loginctlコマンドで情報を取得できる。サブコマンド形式になっていて、セッションに関するものは以下。このうちlist-sessionsshow-sessionあたりで見ていく。

$ loginctl -h
...
Session Commands:
  list-sessions            List sessions
  session-status [ID...]   Show session status
  show-session [ID...]     Show properties of sessions or the manager
  activate [ID]            Activate a session
  lock-session [ID...]     Screen lock one or more sessions
  unlock-session [ID...]   Screen unlock one or more sessions
  lock-sessions            Screen lock all current sessions
  unlock-sessions          Screen unlock all current sessions
  terminate-session ID...  Terminate one or more sessions
  kill-session ID...       Send signal to processes of a session
...

loginctl list-sessionsでセッションのリストを表示する

セッションのリストを表示する。以下はayatakaユーザーとtestユーザーで同時にログインしている状態。

$ loginctl list-sessions
   SESSION        UID USER             SEAT
         1       1000 ayataka          seat0
        47       1001 test             seat0
        c8         42 gdm              seat0

loginctl show-sessionでセッション情報を取得する

list-sessionsでセッションIDを調べたら、show-sessionで詳細情報を取得する。この中のActiveがyesだったりStateがactiveだと表示中。非表示中だとnoとかonlineとかになる。

詳細な情報とか意味は公式ドキュメントで。今回は細かいところは理解していない。

$ loginctl show-session 1
Id=1
User=1000
Name=ayataka
Timestamp=Sat 2019-03-02 21:56:39 JST
TimestampMonotonic=151218846
VTNr=1
Seat=seat0
Display=:0
Remote=no
Service=gdm-password
Scope=session-1.scope
Leader=30172
Audit=1
Type=x11
Class=user
Active=yes # <- yes
State=active # <- active
IdleHint=no
IdleSinceHint=1551587104930805
IdleSinceHintMonotonic=19749233850
LockedHint=no

/run/systemd/sessions/以下のファイル

セッションの情報は/run/systemd/sessions/以下にセッションIDごとにファイルが存在していて、一応そこから参照できる。ただし「# This is private data. Do not parse.」。

$ cat /run/systemd/sessions/1
# This is private data. Do not parse.
UID=1000
USER=ayataka
ACTIVE=1
STATE=active
REMOTE=0
STOPPING=0
TYPE=x11
CLASS=user
SCOPE=session-1.scope
FIFO=/run/systemd/sessions/1.ref
SEAT=seat0
DISPLAY=:0
SERVICE=gdm-password
VTNR=1
LEADER=30172
AUDIT=1
REALTIME=1551531399727614
MONOTONIC=151218846

ログアウト済みのセッション情報

実は記事作成中、list-sessionsの結果は以下のようになっていた。testユーザーが2つある...

$ loginctl list-sessions
   SESSION        UID USER             SEAT
         1       1000 ayataka          seat0
        47       1001 test             seat0
        c8         42 gdm              seat0
        29       1001 test             seat0 # <- なんぞこれ?

中身を表示したところ、どうやら一度ログインしてログアウトした時の情報が残ってるっぽい。

$ loginctl show-session 29
Id=29
User=1001
Name=test
Timestamp=Sun 2019-03-03 09:57:15 JST
TimestampMonotonic=12154020744
VTNr=2
Seat=seat0
Display=:1
Remote=no
Service=gdm-password
Scope=session-29.scope
Leader=35515
Audit=29
Type=x11
Class=user
Active=no
State=closing # <- closing
IdleHint=no
IdleSinceHint=1551586915841192
IdleSinceHintMonotonic=19560144236
LockedHint=no