loginctlでGUIセッションの情報を取得する
LinuxでGUI表示中のユーザーかどうか(セッションがアクティブかどうか)を調べる方法がないかと調べて行ったらloginctl
に行き着いた。Linuxの(というかsystemdのか?)セッションに詳しくないのでフレーズの使い方が微妙なんだけど、概ね必要な情報は取れてたのでまとめておく。
loginctl list-sessions
でGUIログイン中のセッションリストを取得できるloginctl show-session [ID...]
で指定したセッションの詳細が表示できる/run/systemd/sessions/
以下のファイルからshow-session
の情報が取得できる- が、「# This is private data. Do not parse.」
環境
- CentOS 7.6.1810
- systemd 219 (loginctl --version)
systemdに依存しているので、systemdのシステムなら通じるはず。逆にsystemdではないシステムでは全く通じない。
system-logindのloginctlコマンド
loginctl
コマンドで情報を取得できる。サブコマンド形式になっていて、セッションに関するものは以下。このうちlist-sessions
とshow-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