/usr/bin/*ctl なプログラムが何をするのかを試してみました(loginctl)
この記事は 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 コマンドなどと併用すると便利でしょう。