systemd とは?設定ファイルの書き方や定期実行の方法

systemd

systemd とは、最初に起動するプロセス (init) で、他のプロセスを起動する役割を持ちます

つまり、コンピュータの電源を入れてから起動処理を行うものです。

systemd は他にも様々な機能を持つため、クイックリンクを記載します。

本記事では、主に init (起動処理関連) に焦点を当てて解説します。

sudo systemctl start nginx
sudo systemctl enable nginx
関連記事:Linux の基本機能
スポンサーリンク

Systemd ユニット

Systemd ユニット

Systemd ユニットとは、systemd が管理する単位です。

よく利用する Systemd ユニットには、次のタイプが存在します。

ユニットタイプファイルの拡張子説明
サービス.servicesystemd が起動したプロセスを制御および管理
ターゲット.targetsystemd ユニットのグループ
タイマー.timer特定の間隔で実行 (cron の代替)
全てのユニットタイプ一覧はこちら
マウントユニットタイプは、systemd が /etc/fstab から /run/systemd/generator にユニットファイルを自動生成

以降では、ターゲット、サービス、タイマーの順解説します。

スポンサーリンク

systemd ターゲット

systemd ターゲット

systemd ターゲットとは、ブート時に起動する systemd ユニットの一覧です

systemd ターゲットは、systemd ユニットのターゲット (.target) に相当します。

Linux カーネルは、systemd プロセス (/usr/lib/systemd/systemd) を PID 1 として起動

systemd ターゲットを切り替えることで、ブート時に起動するプロセスを切り替えます。

SysV ランレベル

systemd ターゲットは、昔の SysV ランレベル (Linux の動作モード) に相当します。

ランレベルターゲットユニット詳細
0poweroff.targetシステムをシャットダウンし、電源を切る
1rescue.targetレスキューシェル (シングルユーザーシステム)
システムが壊れた時のリカバリーモード
2, 3, 4multi-user.target非グラフィカルなマルチユーザーシステム (CUI)
5graphical.targetグラフィカルなマルチユーザーシステム (GUI)
6reboot.targetシステムをシャットダウンして再起動
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-targets
故障した時は、rescue.target で起動

デフォルトのターゲットを確認

systemctl get-default
graphical.target

デフォルトのターゲットを変更

sudo systemctl set-default multi-user.target
systemctl get-default
multi-user.target

デフォルトのターゲットユニットはブート時に読み込むので、反映させるには再起動します。

sudo systemctl reboot

ロード中のターゲット一覧

systemctl list-units --type target
  basic.target             loaded active active Basic System
  cryptsetup.target        loaded active active Local Encrypted Volumes
  getty.target             loaded active active Login Prompts
  integritysetup.target    loaded active active Local Integrity Protected Volumes
(一部省略)
  multi-user.target        loaded active active Multi-User System
  sysinit.target           loaded active active System Initialization
  timers.target            loaded active active Timer Units
  veritysetup.target       loaded active active Local Verity Protected Volumes

先ほど設定したデフォルトの multi-user.target 以外にも色々なターゲットユニットが表示される理由は、multi-user.target に他のターゲットユニットが含まれるからです。


/usr/lib/systemd/system/ や /etc/systemd/system/ にターゲットユニットとその内容があります。
順序関係には before と after がある。上記は after の順序関係なので、sysinit.target が最初に起動

これを依存関係や順序関係と言います。(詳細はこちら)

依存関係/順序関係の確認

systemctl list-dependencies
default.target
○ ├─display-manager.service
○ ├─systemd-update-utmp-runlevel.service
● └─multi-user.target
●   ├─basic.target
(抜粋)

multi-user.target と basic.target に依存関係/順序関係があることが確認できます。

現在のターゲットユニットを変更

デフォルト (ブート時) ではなく、現在ロード中のターゲットユニットを変更する方法は以下です

sudo systemctl isolate graphical.target
systemctl list-units --type target|grep graphical
graphical.target         loaded active active Graphical Interface

現在ロードしているターゲットに、graphical.target が追加されました。

スポンサーリンク

systemd サービス (システムサービス)

システムサービス

システムサービスとは、systemd が起動したプロセスです。

システムサービスは、systemd ユニットのサービス (.service) に相当します。

システムサービスの一覧を確認

systemctl list-units --type service
...
  sshd.service            loaded active running OpenSSH server daemon
  systemd-logind.service  loaded active running User Login Management

システムサービスを起動

dnf などで新規にインストールした場合、システムサービスとして新規に起動します。

sudo systemctl start nginx

システムサービスの停止

sudo systemctl stop nginx

システムサービスの再起動

sudo systemctl restart nginx

システムサービスの自動起動

sudo systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

デフォルト (ブート時) の systemd ターゲットシンボリックリンクを追加して自動起動します。

システムサービスの自動起動無効

sudo systemctl disable nginx
Removed "/etc/systemd/system/multi-user.target.wants/nginx.service".

デフォルト (ブート時) の systemd ターゲットからシンボリックリンクを削除します。

システムサービスの詳細情報

システムサービスが起動しているか、自動起動が有効か?などを確認できます。

sudo systemctl status nginx

ユニットファイルの書き方

ここからは、ユニットファイルの具体的な書き方を紹介します。

ユニットファイルの場所

ユニットファイルは次の場所にあります。(優先度が高い設定ファイルに上書きされます)

優先度Path説明
/usr/lib/systemd/systemパッケージインストール時点のデフォルトの設定
(つまり dnf update で上書きされる)
/run/systemd/system/実行時に作成されたユニットファイル
/etc/systemd/system/全ての設定を上書きして自由に設定できます
(後述の systemd enable で作成される設定ファイル)
https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/configuring_basic_system_settings/managing-systemd_configuring-basic-system-settings#unit-files-locations_managing-systemd

ユニットファイルの内容

ユニットファイルは次の3つのセクションを持ちます。

セクション説明
[Unit]ユニットタイプに依存しない設定
ユニットの説明/起動順序/同時起動の禁止などを設定します
[unit type]ユニットタイプに依存する設定
ユニットタイプが [サービス] の場合、セクション名は [Service] です
[Install]サービスの自動起動に関する設定
(systemctl enable/disable コマンドに関連)

Unit セクションの詳細

Unit セクションでは、起動順序や同時に起動しないユニットを設定します。

セクション詳細
Descriptionユニットの説明
systemctl status <サービス名> コマンドで表示される説明
Documentationユニットのドキュメントの URI
Afterユニットが開始する順序 (ユニットの起動する順番) を設定
After で指定したユニットがアクティブになると、このユニットを開始
Beforeユニットが開始する順序 (ユニットの起動する順番) を設定
このユニットがアクティブになると、Before で指定したユニットを開始
Requiresユニットに依存関係 (並列に起動するユニット) を設定
指定したユニットのアクティブ化に失敗すると、このユニットを開始しません
Wantsユニットに依存関係 (並列に起動するユニット) を設定
指定したユニットのアクティブ化に失敗しても、このユニットは開始します
ConflictsRequires と反対の依存関係 (負の依存関係) を設定
指定したユニットと並列 (同時) に起動できないユニット
systemd.unit(5) man ページ
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files#tabl-Managing_Services_with_systemd-Unit_Sec_Options

unit type セクションの詳細

unit type セクションは、ユニットタイプごとに異なる設定が可能です。

例えば、サービスユニットの場合は以下の設定が可能です。

セクション詳細
Typeユニットの起動タイミングの指定
EnvironmentFile環境変数を読み込むファイル
ExecStartユニットの開始時に実行するコマンドまたはスクリプト
ExecStopユニットの停止時に実行するコマンドまたはスクリプト
ExecReloadユニットの再読み込み時に実行するコマンドまたはスクリプト
Restartユニットを再起動する条件
RemainAfterExitユニットのプロセスがすべて終了していてもアクティブと見なす
systemd.service(5)man ページ
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files#tabl-Managing_Services_with_systemd-Service_Sec_Options

Install セクションの詳細

Install セクションは、systemctl enable の動作 (ブート時の起動ユニット) を設定します。

セクション詳細
RequiredBy/etc/systemd/system/ユニット.requires にシンボリックリンクを作成
WantedBy/etc/systemd/system/ユニット.wants にシンボリックリンクを作成
Also他にシンボリックリンクを作成するユニット
systemd.unit(5) man ページ
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files#tabl-Managing_Services_with_systemd-Install_Sec_Options

ユニットファイルの設定例

例として、touch コマンドを実行するサービスユニットファイルを作成してみます。

sudo vim /etc/systemd/system/test.service
[Unit]
Description=test service

[Service]
Type=simple
ExecStart=touch /home/ec2-user/test.txt

[Install]
WantedBy=multi-user.target
sudo systemctl start test.service
sudo systemctl status test.service
○ test.service - test service
    Process: 6031 ExecStart=touch /home/ec2-user/test.txt (code=exited, status=0/SUCCESS)

先ほど設定したとおりの内容が確認できます。

もちろん、サービスに設定した touch /home/ec2-user/test.txt コマンドも実行されています。

ls -l /home/ec2-user/test.txt

起動済みユニットの設定変更を反映

既に起動しているユニットの設定を変更した場合は、以下のコマンドで設定を反映できます。

sudo systemctl daemon-reload

Systemd タイマー (cron の代替)

Systemd タイマー

Systemd タイマーとは、定期実行する systemd ユニットです。(cron の代替)

Systemd タイマーの設定

まずは、定期実行するサービスユニットを作成します。(先ほど作成したものと同じ)

今回は、ファイルを作成 (touch /home/ec2-user/test.txt) するサービスを作成します。

sudo vim /etc/systemd/system/test.service
[Unit]
Description=test service

[Service]
Type=simple
ExecStart=touch /home/ec2-user/test.txt

[Install]
WantedBy=multi-user.target

次に、先ほどのサービスを定期実行するタイマーユニットを作成します。

sudo vim /etc/systemd/system/test.timer
[Timer]
OnCalendar=Wed *-*-* 22:00:00
Unit=test.service

[Install]
WantedBy=multi-user.target

systemd タイマーの時間指定

時間の指定方法は OnCalendar= で以下のように指定します。

Oncalendar の値意味
[曜日 年-月-日 時:分:秒]例:Wed *-*-* 22:00:00 は、全ての年月日の水曜 22 時を表す
書式の詳細はこちら
minutely毎分
hourly毎時間
daily毎日
monthly毎月
yearly毎年

systemd のタイムゾーンを変更

デフォルトでは UTC に設定されていることも多いので、タイムゾーンを確認します。

timedatectl status
Time zone: n/a (UTC, +0000)

上記のようにタイムゾーンが日本じゃ無い場合は、Asia/Tokyo (JST, +0900) に設定します。
(設定可能なタイムゾーン一覧は timedatectl list-timezones コマンドで確認可能)

sudo timedatectl set-timezone Asia/Tokyo

Systemd タイマーを起動

sudo systemctl start test.timer

タイマーを起動したら、指定した時間まで待ってから以下のコマンドで確認します。

ls -l /home/ec2-user/test.txt
-rw-r--r--. 1 root root 0 Nov  6 22:00 /home/ec2-user/test.txt

タイマーで設定した時刻にファイルが作成されていることが確認できます。

なお、システム再起動時に systemd タイマーユニットが自動起動するように設定できます。

sudo systemctl enable test.timer

systemd タイマーの一覧を確認

前回のタイマーの実行状況や、次回の実行予定が確認できます。

sudo systemctl list-timers
NEXT                        LEFT        LAST                        PASSED       UNIT                             ACTIVATES    
Thu 2024-11-14 15:00:00 JST 6 days left Thu 2024-11-07 15:00:05 JST 1min 8s ago  test.timer                       test.service

関連情報

学習ロードマップ
関連記事:Linux の基本機能
Linux カーネルの機能
ネットワークのコマンド
関連記事:サーバー

参考サイト

第10章 systemd によるサービス管理 Red Hat Enterprise Linux 7 | Red Hat Customer Portal
Access Red Hat’s knowledge, guidance, and support through your subscription.
第10章 systemd によるサービス管理 Red Hat Enterprise Linux 7 | Red Hat Customer Portal
Access Red Hat’s knowledge, guidance, and support through your subscription.
第12章 systemd の管理 | Red Hat Product Documentation
第12章 systemd の管理 | Red Hat Documentation