« | »

この記事は openSUSE Advent Calendar 2022 の7日目です。

systemd が使われるようになると、daemon の制御とかのやり方は大きく変わりました。/etc/init.d にあるスクリプトから、systemd パッケージに含まれるコマンドを使うようになってきました。それらのコマンドは、xxxxxctl という、末尾に ctl が含まれるものが多いように感じました。そこで、/usr/bin/ の中にある、末尾が ctl なプログラムがどんなものかを簡単に調べて見ることにしました。

今回は、loginctl を紹介します。

コマンド名: localectl
パッケージ: systemd-249.12-150400.8.13.1.x86_64
動作: ○

詳細:
loginctl は、systemd の login マネージャからの情報を表示したり設定するためのツールです。表示に関しては、従来の w コマンドや ps コマンド などの機能が含まれています。たとえば、現在ログインしている情報は、下記のように表示されます。

%loginctl
SESSION  UID USER   SEAT  TTY
     11 1000 ribbon       pts/0
     12 1000 ribbon       pts/2
     13    0 root
      6 1000 ribbon seat0 tty2

w コマンドではこのように表示されます。表示する内容がかなり異なります。

%w
 20:10:49 up 12:55,  5 users,  load average: 0.00, 0.01, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
ribbon   :        :                15:20   ?xdm?   2:18   0.07s gdm-session-worker [pam/gdm-password]
ribbon   tty2     tty2             15:20   12:55m  0.08s  0.08s /usr/lib/gnome-session-binary
ribbon   pts/0    192.168.X.Y      18:17   10:29   0.28s  0.00s less
ribbon   pts/2    192.168.X.Y      19:46    1.00s  0.11s  0.01s w
root     pts/3    ::1              20:02    7:58   0.09s  0.09s -bash

自分自身のセッション情報は session-status サブコマンドで表示できます。

%loginctl session-status
12 - ribbon (1000)
           Since: Sat 2022-12-03 19:46:34 JST; 28min ago
          Leader: 7798 (sshd)
             TTY: pts/2
          Remote: 192.168.X.Y
         Service: sshd; type tty; class user
           State: active
            Unit: session-12.scope
                  ┣ 7798 "sshd: ribbon [priv]" ""
                  ┣ 7800 "sshd: ribbon@pts/2" "" ""
                  ┣ 7801 -bash
                  ┣ 8134 loginctl session-status
                  ┗ 8135 less

さらに、 user-status サブコマンドで、詳細な情報を得ることができます。pstree コマンドにも似た感じです。

%loginctl user-status
ribbon (1000)
           Since: Sat 2022-12-03 15:20:50 JST; 5h 8min ago
           State: active
        Sessions: 12 11 *6
          Linger: no
            Unit: user-1000.slice
                  ┣session-11.scope
                  ┃┣ 7431 "sshd: ribbon [priv]" ""
                  ┃┣ 7437 "sshd: ribbon@pts/0" "" ""
                  ┃┣ 7438 -bash
                  ┃┣ 7780 man loginctl
                  ┃┗ 7792 less
                  ┣session-12.scope
                  ┃┣ 7798 "sshd: ribbon [priv]" ""
                  ┃┣ 7800 "sshd: ribbon@pts/2" "" ""
                  ┃┣ 7801 -bash
                  ┃┣ 8270 loginctl user-status
                  ┃┗ 8271 less
                  ┣session-6.scope
                  ┃┣ 4748 "gdm-session-worker [pam/gdm-password]"
                  ┃┣ 4778 /usr/bin/gnome-keyring-daemon --daemonize --login
                  ┃┣ 4784 /usr/lib/gdm/gdm-wayland-session /usr/bin/gnome-session
                  ┃┣ 4788 /usr/lib/gnome-session-binary
                  ┃┗ 7997 /usr/bin/ssh-agent -D -a /run/user/1000/keyring/.ssh
                  ┗user@1000.service
                    ┣app.slice
                    ┃┣app-gnome-YaST2\x2dorg.opensuse.yast.LAN-5394.scope
                    ┃┃┣ 5523 dbus-launch --autolaunch 61ee5253e44f403c9918308e232c84b8 --binary-syntax>
                    ┃┃┗ 5524 /usr/bin/dbus-daemon --syslog-only --fork --print-pid 5 --print-address 7>
                    ┃┣app-gnome-gnome\x2dsoftware\x2dservice-5036.scope
                    ┃┃┗ 5036 /usr/bin/gnome-software --gapplication-service
                    ┃┣app-gnome-org.gnome.Evolution\x2dalarm\x2dnotify-5045.scope
                    ┃┃┗ 5045 /usr/lib/evolution-data-server/evolution-data-server/evolution-alarm-noti>
                    ┃┣app-gnome-org.gnome.SettingsDaemon.DiskUtilityNotify-5018.scope
                    ┃┃┗ 5018 /usr/lib/gsd-disk-utility-notify

そのほかに、セッションを強制切断する kill-session サブコマンドがあります。たとえば、ssh でログインしているセッションを強制切断するためには、
1) w コマンドでユーザを調べる
2) そのユーザが使っている sshd プロセスを ps コマンドで調べる
3) kill コマンドでそのプロセスを終了させる。
というステップが必要でしたが、loginctl では、セッション番号を表示させた後、そのセッションを終了するコマンドを入力することで作業が行えますので、手間が減ります。

# loginctl
SESSION  UID USER   SEAT  TTY
     11 1000 ribbon       pts/0
     12 1000 ribbon       pts/2
     13    0 root
      6 1000 ribbon seat0 tty2

4 sessions listed.
# loginctl kill-session 13
# loginctl
SESSION  UID USER   SEAT  TTY
     11 1000 ribbon       pts/0
     12 1000 ribbon       pts/2
      6 1000 ribbon seat0 tty2

3 sessions listed.

loginctl は、表示形式が見やすいので、w コマンドなどと併用すると便利でしょう。

コメント/トラックバック