systemd - サブコマンド編

お久しぶりです、masm11 です。 今更かと思いますが、今回から何回かに分けて、systemd について説明したいと思います。

systemd とは、Linux の init システムを置き換えるものです。 PID 1 として起動され、 サービスの管理やネットワークの管理、時刻の管理、 syslog の代替、cron の代替、果ては boot loader といった機能まで持ちます (これらの機能全てが PID 1 で実行されているわけではないです)。

今回は、systemd のコマンド systemctl について、サブコマンドをご紹介します。

list-unit-files

list-unit-files は、どんなサービスがあるのかを、列挙することができます。

luna:~ % systemctl list-unit-files | grep sshd.service
sshd.service                                                              enabled         disabled     

拡張子のように最後に .service が付くものがサービスです。 .service の他にも .timer.socket などもあります。 これらを unit file と呼び、次回以降に紹介します。

start/stop/restart

各 unit file を start や stop することができます。

luna:~ % sudo systemctl start sshd.service

サービスを起動/停止するイメージですが、タイマー等も start することができます。

サービスを start した時にどんなコマンドが実行されるかは、 unit file の中に書いてあります。

enable/disable

各 unit file は enable や disable することができます。

enable しておくと、次回 boot 時に自動的に start されます。

luna:~ % sudo systemctl enable sshd.service
Created symlink /etc/systemd/system/multi-user.target.wants/sshd.service → /usr/lib/systemd/system/sshd.service.
luna:~ % 

この出力の通り、実は enable はシンボリックリンクで表現されていますので、 単にシンボリックリンクを張ることでも同じことができます。

status

サービスの状態を表示することができます。

luna:~ % systemctl status sshd.service
● sshd.service - OpenSSH Daemon
     Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: disabled)
     Active: active (running) since Wed 2020-09-23 21:20:18 JST; 1h 10min ago
   Main PID: 1130 (sshd)
      Tasks: 1 (limit: 18425)
     Memory: 1.5M
     CGroup: /system.slice/sshd.service
             └─1130 sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups

 923 21:20:18 luna systemd[1]: Started OpenSSH Daemon.
 923 21:20:18 luna sshd[1130]: Server listening on 0.0.0.0 port 22.
 923 21:20:18 luna sshd[1130]: Server listening on :: port 22.

Loaded: 行の中央やや右寄りの enabled が enable してあるかどうかを表示しています。 右端の vendor preset: disabled はデフォルトで enable か disable かを表示しているだけですので、 間違えないようにしましょう。

Active: 行の running は実行中であることを示しています。 一度実行してすぐ終了するサービスもあって、そういうものは exited になっていますので、 running 以外だから即異常、というわけではありません。

最後の3行は sshd に関するログを表示しています。

mask/unmask

「この unit file 要らない!」と思ったら、mask することができます。

luna:~ % sudo systemctl mask sshd.service
Created symlink /etc/systemd/system/sshd.service → /dev/null.

これもシンボリックリンクを張っているだけですので、 シンボリックリンクを張れば同様のことができます。

ところで、サービスが要らないなら disable すればいいじゃん、と思いませんか? 実は disable できないサービスも存在するのです。 そんな時には mask が役に立ちます。

daemon-reload

unit file を書き換えてもすぐには反映されません。 reboot するか、systemctl daemon-reload することで反映されます。

よく忘れて戸惑います。気をつけましょう…

list-timers

.timer という種類の unit file があります。要するに cron の代替機能です。

各タイマーが、最近いつ発動して、次にいつ発動するのか、等を表示することができます。

luna:~ % systemctl list-timers -a
NEXT                        LEFT                LAST                        PASSED             UNIT                         ACTIVATES
Thu 2020-09-24 00:00:00 JST 1h 18min left       Wed 2020-09-23 00:00:00 JST 22h ago            man-db.timer                 man-db.service
Thu 2020-09-24 00:00:00 JST 1h 18min left       Wed 2020-09-23 00:00:00 JST 22h ago            shadow.timer                 shadow.service
Thu 2020-09-24 00:00:00 JST 1h 18min left       Wed 2020-09-23 00:00:00 JST 22h ago            updatedb.timer               updatedb.service
Thu 2020-09-24 21:57:52 JST 23h left            Wed 2020-09-23 21:35:20 JST 1h 5min ago        systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service

4 timers listed.

-a を付けると、stop 状態のタイマーも表示してくれます。 私は常に -a を付けることにしています。

最初に紹介した list-unit-files についてもそうなのですが、 私は「いいから全部出せ!」と思っていて、多すぎたら grep で必要な行だけ抽出する、というやり方をしています。

まとめ

systemd について、今回は概要っぽくサブコマンドについてご紹介しました。

サブコマンドは他にもまだまだありまして、今回紹介したのは私がよく使うものだけに絞りました。

先程改めて man systemctl したところ、 全然記憶にないものがいろいろありました。おそらく時々増えているのでしょう。 今後も増えていくでしょうから、時々は man を確認してみるのが良さそうです。

次回は unit file の .service について紹介したいと思います。

ではまた。