Linux – systemd のユニット (Unit) について

目次

概要

この記事では、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/: システムが提供するデフォルトのユニットファイルを格納する場所です。パッケージ管理システムで管理されます。

ユニットファイルの書式

ユニットファイルは、以下のセクションに分かれています。

  1. [Unit]
  2. [Service] (サービスユニットの場合)
  3. [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.targetauditd.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_OPTSEnvironmentFile で設定されるオプションです。
  • 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

    • このユニットの別名を指定します。この別名でユニットを参照できます。

参照

コメント

コメントする

目次