概要
この記事では、Linux の systemd のユニット (Unit) について解説します。
ユニット (Unit)
systemd
のユニットは、systemd
が管理する個別のタスクやリソースを表す基本単位で、ファイルで定義されます。ユニットを利用して、サービスの起動や停止、設定の管理を行います。ユニットには以下のような種類があります。
ユニットの種類 | 拡張子 | 説明 |
---|---|---|
サービスユニット | .service |
実行可能なプログラムやデーモンを管理します。 |
ターゲットユニット | .target |
複数のユニットをグループ化し、システムの特定の状態を表します。 |
マウントユニット | .mount |
ファイルシステムのマウントポイントを管理します。 |
ソケットユニット | .socket |
ソケットファイルを管理し、サービスとの接続を待ち受けます。 |
デバイスユニット | .device |
デバイスファイルを管理します。 |
タイマーユニット | .timer |
定期的なタスクの実行を管理します。cron の代替として使用されることもあります。 |
ユニットファイルの場所
ユニットファイルは通常 /etc/systemd/system/
または /usr/lib/systemd/system/
に配置されます。
/etc/systemd/system/
: 管理者が作成したユニットファイルを格納する場所です。/usr/lib/systemd/system/
: システムが提供するデフォルトのユニットファイルを格納する場所です。パッケージ管理システムで管理されます。
ユニットファイルの書式
ユニットファイルは、以下のセクションに分かれています。
[Unit]
[Service]
(サービスユニットの場合)[Install]
以下は、一般的なサービスユニットファイルの例です。
[Unit]
Description=Example Service
After=network.target
[Service]
ExecStart=/usr/bin/example
Restart=always
User=exampleuser
Group=examplegroup
[Install]
WantedBy=multi-user.target
Unit セクション
[Unit]
セクションは、ユニットのメタデータや依存関係を定義します。
このセクションは、ユニットの説明や他のユニットとの関係を指定するために使用されます。
以下に、[Unit]
セクションの主要なディレクティブとその説明を示します。
Description:
- ユニットの簡単な説明を記述します。
- 例:
Description=Example Service
Documentation:
- ユニットに関連するドキュメントへのリンクを指定します。
- 例:
Documentation=https://example.com/docs
Requires:
- このユニットが開始される前に開始する必要がある他のユニットを指定します。依存関係が満たされない場合、このユニットも開始されません。
- 例:
Requires=network.target
Wants:
Requires
と似ていますが、依存関係が満たされなくてもこのユニットは開始されます。推奨される依存関係を指定します。- 例:
Wants=network-online.target
Before:
- このユニットが指定されたユニットよりも前に開始されることを指定します。
- 例:
Before=multi-user.target
After:
- このユニットが指定されたユニットの後に開始されることを指定します。
- 例:
After=network.target
Conflicts:
- このユニットと同時に実行できないユニットを指定します。指定されたユニットが実行中の場合、このユニットは開始されません。
- 例:
Conflicts=shutdown.target
Condition…:
- ユニットが開始される前に特定の条件をチェックします。条件が満たされない場合、ユニットは開始されません。
- 例:
ConditionPathExists=/etc/example.conf
Service セクション
[Service]
セクションは、サービスユニットファイルにおいてサービスの実行方法や動作を定義する部分です。
このセクションには、サービスの起動、停止、再起動の方法や、サービスの実行に関する各種設定を記述します。
Type:
- サービスの起動タイプを指定します。以下のタイプがあります:
simple
: デフォルトのタイプで、ExecStart
で指定されたプロセスがフォークしない場合に使用します。forking
:ExecStart
で指定されたプロセスがフォークする場合に使用します。この場合、親プロセスは終了し、子プロセスが継続します。oneshot
: 短期的なタスクで、起動後すぐに終了するサービスに使用します。notify
: サービスが起動時にsystemd
に対して準備完了の通知を送信する場合に使用します。idle
: 他のジョブが終了するまで実行を遅延させる場合に使用します。
- サービスの起動タイプを指定します。以下のタイプがあります:
ExecStart:
- サービスを開始するためのコマンドを指定します。必須ディレクティブです。
- 例:
ExecStart=/usr/bin/example
ExecStop:
- サービスを停止するためのコマンドを指定します。
- 例:
ExecStop=/usr/bin/example-stop
ExecReload:
- サービスをリロードするためのコマンドを指定します。
- 例:
ExecReload=/usr/bin/example-reload
Restart:
- サービスが終了したときの再起動ポリシーを指定します。以下のオプションがあります:
no
: 再起動しません (デフォルト)。always
: 常に再起動します。on-success
: 正常終了した場合に再起動します。on-failure
: 異常終了した場合に再起動します。on-abnormal
: 異常終了 (シグナルによる終了など) の場合に再起動します。on-abort
: プロセスがアボートした場合に再起動します。on-watchdog
: ウォッチドッグタイムアウトの場合に再起動します。
- 例:
Restart=always
- サービスが終了したときの再起動ポリシーを指定します。以下のオプションがあります:
User:
- サービスを実行するユーザを指定します。
- 例:
User=exampleuser
Group:
- サービスを実行するグループを指定します。
- 例:
Group=examplegroup
PIDFile:
- サービスのメインプロセスの PID を記録するファイルのパスを指定します。
- 例:
PIDFile=/run/example.pid
Environment:
- 環境変数を設定します。
- 例:
Environment="ENV_VAR=value"
Install セクション
[Install]
セクションは、systemd ユニットファイルにおいてユニットのインストール時の設定を定義する部分です。このセクションには、ユニットがどのターゲットに関連付けられるかや、ユニットの有効化に関する情報が含まれます。具体的には、ユニットがどのターゲットに依存するか、どのターゲットによって有効化されるかを指定します。以下に、[Install]
セクションの主要なディレクティブとその説明を示します。
WantedBy:
- ユニットが指定されたターゲットに「望まれている」ことを示します。
ユニットが有効化されたときに、指定されたターゲットの
wants
ディレクトリにシンボリックリンクが作成され、ターゲットが有効化されるときにユニットが有効化されます。WantedBy
で指定された依存関係は必須ではなく、ユニットが起動しなくてもターゲットは正常に動作します。 - 例:
WantedBy=multi-user.target
- ユニットが指定されたターゲットに「望まれている」ことを示します。
ユニットが有効化されたときに、指定されたターゲットの
RequiredBy:
- ユニットが指定されたターゲットに「必須」であることを示します。
ユニットが有効化されたときに、指定されたターゲットの
requires
ディレクトリにシンボリックリンクが作成され、ターゲットが有効化されるときにユニットが有効化されます。RequiredBy
で指定された依存関係は必須であり、ユニットが起動しない場合、ターゲットも起動しません。 - 例:
RequiredBy=multi-user.target
- ユニットが指定されたターゲットに「必須」であることを示します。
ユニットが有効化されたときに、指定されたターゲットの
Alias:
- このユニットの別名を指定します。この別名でユニットを参照できるようになり、同名のシンボリックリンクが
aliases
ディレクトリに作成されます。 - 例:
Alias=example.service
- このユニットの別名を指定します。この別名でユニットを参照できるようになり、同名のシンボリックリンクが
Also:
- このユニットと一緒に有効化または無効化される他のユニットを指定します。このディレクティブにより、関連するユニットが一緒に有効化されることが保証されます。
- 例:
Also=example-helper.service
DefaultInstance:
- テンプレートユニットファイル (
@
付きユニットファイル) の場合、インスタンスごとのデフォルト名を指定します。 - 例:
DefaultInstance=example@default
- テンプレートユニットファイル (
サービスユニットファイルの例
以下は ssh のサービスユニットを定義する /lib/systemd/system/ssh.service
の内容です。
[Unit]
Description=OpenBSD Secure Shell server
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
Alias=sshd.service
[Service]
セクション
After:
After=network.target auditd.service
network.target
とauditd.service
が起動した後にこのユニットを起動することを指定しています。
ConditionPathExists:
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
- 指定されたパスが存在しない場合にのみユニットを起動します。ここでは、
/etc/ssh/sshd_not_to_be_run
ファイルが存在しない場合にのみsshd
を起動します。
[Service]
セクション
EnvironmentFile=-/etc/default/ssh
- 環境変数を定義するファイルを指定します。先頭に
-
を付けることで、ファイルが存在しない場合でもサービスの起動が続行されます。
- 環境変数を定義するファイルを指定します。先頭に
ExecStartPre=/usr/sbin/sshd -t
sshd
を起動する前に設定ファイルのテストを行います。
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
sshd
をデーモン化せずに起動します。$SSHD_OPTS
はEnvironmentFile
で設定されるオプションです。
ExecReload=/usr/sbin/sshd -t
- サービスのリロード時に設定ファイルのテストを行います。
ExecReload=/bin/kill -HUP $MAINPID
- メインプロセスに
HUP
シグナルを送信して設定をリロードします。
- メインプロセスに
KillMode=process
- プロセスグループ全体ではなく、メインプロセスのみを終了させます。
Restart=on-failure
- サービスが失敗した場合に再起動します。
RestartPreventExitStatus=255
- 終了ステータスが
255
の場合には再起動を防ぎます。
- 終了ステータスが
Type=notify
- サービスが起動完了を systemd に通知します。
RuntimeDirectory=sshd
- サービスのためのランタイムディレクトリを指定します。
RuntimeDirectoryMode=0755
- ランタイムディレクトリのパーミッションを指定します。
[Install]
セクション
WantedBy=multi-user.target
- このユニットが
multi-user.target
によって管理されることを指定します。
- このユニットが
Alias=sshd.service
- このユニットの別名を指定します。この別名でユニットを参照できます。
コメント