systemd とは linux のシステムを管理するデーモンです。
Systemd は Unit という単位でシステムを管理しています。
Unit は service, timer, device, target, socket, mount などの Unit タイプがあります。
Unit ファイルは以下に格納されます。
/lib/systemd/system/usr/lib/systemd/system/etc/systemd/systemインストール後の初期設定ファイルが配置されています。
ここに配置されているファイルは編集しません。
インストール後の初期設定ファイルが配置されています。
ここに配置されているファイルは編集しません。
ユーザーが定義した Unit ファイルを配置します。
 systemctl
// rsyslog
$ systemctl start|stop|restart rsyslog.service
// cron
$ systemctl start|stop|restart cron.service
// apache2
$ systemctl start|stop|restart apache2.service
// rsyslog
$ systemctl status rsyslog.service
// cron
$ systemctl status cron.service
// apache2
$ systemctl status apache2.service
Unit 設定を確認する例として certbot.service を例に記載します。
$ systemctl cat certbot.service
# /lib/systemd/system/certbot.service   # <======== ファイルパス
[Unit]
Description=Certbot
Documentation=file:///usr/share/doc/python-certbot-doc/html/index.html
Documentation=https://letsencrypt.readthedocs.io/en/latest/
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot -q renew     # <======== 実行コマンド
PrivateTmp=true
$ systemctl list-units
systemctl list-units は色々なオプションがあります。
$ systemctl list-units --all
これは、システムの現在の状態に関係なく、systemdがロードした、またはロードしようとしたユニットを表示します。実行後に非アクティブになったユニットや、systemdがロードしようとしたもののディスク上で見つからなかったユニットがあるかもしれません。他に、これらの結果をフィルタリングできるフラグがあります。たとえば、--state=フラグを使用して、表示したいLOAD、ACTIVE、またはSUB状態を示すことができます。systemctlが非アクティブなユニットでも表> 示するように、--allフラグを保持する必要があります。
systemctl list-units --all --state=inactive
他に一般的なフィルターとして、--type= があります。興味のあるタイプのユニットのみを表示するようにsystemctl に指示できます。たとえば、アクティブなサービスユニットのみを表示するには、次を使用できます。systemctl list-units --type=service
Apache2 を例に記載します。 現状の自動起動を確認します。
$ sudo systemctl status apache2.service
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)  # <===== この行を確認
  Drop-In: /lib/systemd/system/apache2.service.d
           └─apache2-systemd.conf
   Active: active (running) since Thu 2022-12-29 05:28:43 UTC; 1h 48min ago
 Main PID: 3136 (apache2)
    Tasks: 55 (limit: 1134)
   CGroup: /system.slice/apache2.service
           ├─3136 /usr/sbin/apache2 -k start
           ├─3139 /usr/sbin/apache2 -k start
           └─3140 /usr/sbin/apache2 -k start
Dec 29 05:28:42 ip-10-1-2-54 systemd[1]: Starting The Apache HTTP Server...
Dec 29 05:28:43 ip-10-1-2-54 apachectl[3110]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.1.2.54. Set the 'ServerName' direct
Dec 29 05:28:43 ip-10-1-2-54 systemd[1]: Started The Apache HTTP Server.
以下のような設定になっています。
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
enabled; vendor preset: enabled)enabled; vendor preset: enabled)自動起動を無効にしてみます。
$ sudo systemctl disable apache2.service
Synchronizing state of apache2.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable apache2
確認します。
sudo systemctl status apache2.service
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; disabled; vendor preset: enabled)
  Drop-In: /lib/systemd/system/apache2.service.d
           └─apache2-systemd.conf
   Active: active (running) since Thu 2022-12-29 05:28:43 UTC; 1h 53min ago
 Main PID: 3136 (apache2)
    Tasks: 55 (limit: 1134)
   CGroup: /system.slice/apache2.service
           ├─3136 /usr/sbin/apache2 -k start
           ├─3139 /usr/sbin/apache2 -k start
           └─3140 /usr/sbin/apache2 -k start
Dec 29 05:28:42 ip-10-1-2-54 systemd[1]: Starting The Apache HTTP Server...
Dec 29 05:28:43 ip-10-1-2-54 apachectl[3110]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.1.2.54. Set the 'ServerName' direct
Dec 29 05:28:43 ip-10-1-2-54 systemd[1]: Started The Apache HTTP Server.
disabled; vendor preset: enabled)再度有効にしてみます。
$ sudo systemctl enable apache2.service
※ ちなみに無効化は $ sudo systemctl disable apache2.service です。
確認します。
$ sudo systemctl status apache2.service
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
  Drop-In: /lib/systemd/system/apache2.service.d
           └─apache2-systemd.conf
   Active: active (running) since Thu 2022-12-29 05:28:43 UTC; 1h 56min ago
 Main PID: 3136 (apache2)
    Tasks: 55 (limit: 1134)
   CGroup: /system.slice/apache2.service
           ├─3136 /usr/sbin/apache2 -k start
           ├─3139 /usr/sbin/apache2 -k start
           └─3140 /usr/sbin/apache2 -k start
Dec 29 05:28:42 ip-10-1-2-54 systemd[1]: Starting The Apache HTTP Server...
Dec 29 05:28:43 ip-10-1-2-54 apachectl[3110]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.1.2.54. Set the 'ServerName' direct
Dec 29 05:28:43 ip-10-1-2-54 systemd[1]: Started The Apache HTTP Server.
enabled; vendor preset: enabled)$ systemctl list-timers
NEXT                         LEFT          LAST                         PASSED       UNIT                         ACTIVATES
水 2023-01-04 11:09:00 JST  2min 28s left 水 2023-01-04 10:39:10 JST  27min ago    phpsessionclean.timer        phpsessionclean.service
水 2023-01-04 19:17:20 JST  8h left       水 2023-01-04 02:52:17 JST  8h ago       certbot.timer                certbot.service
水 2023-01-04 19:45:01 JST  8h left       火 2023-01-03 19:45:01 JST  15h ago      systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.serv
木 2023-01-05 02:32:55 JST  15h left      水 2023-01-04 06:39:10 JST  4h 27min ago apt-daily.timer              apt-daily.service
木 2023-01-05 06:38:09 JST  19h left      水 2023-01-04 06:41:10 JST  4h 25min ago apt-daily-upgrade.timer      apt-daily-upgrade.service
5 timers listed.
Pass --all to see loaded but inactive timers, too.
lines 1-9/9 (END)
この timer で実行するユニットを指定する(本例ではコメントアウト)。 指定がなければ timer と同名の service を実行する。
ref. https://vlike-vlife.netlify.app/posts/systemd_scheduling
certbot.timerの例(Unitが省略されているので同名のサービスを実行する)
systemctl cat certbot.timer
# /lib/systemd/system/certbot.timer
[Unit]
Description=Run certbot twice daily
[Timer]
OnCalendar=*-*-* 00,12:00:00
RandomizedDelaySec=43200
Persistent=true
[Install]
WantedBy=timers.target
systemdのログを表示するコマンドがjournalctlコマンドです。
apache2のsystemdのログを表示します。
$ journalctl -u apache2.service
詳細なログを表示します。
$ journalctl -ex -u apache2.service
u:Unit(サービス)を指定e:最新のログを表示x:詳細なログを表示