systemd の設定項目

systemd は Linux の標準的なサービスマネージャ。systemdを使うと、システムやサービスの管理を効率的に行うことができます。systemd でサービスの動作を定義するには、/etc/systemd/systemなどにあるサービスファイル(*.service)に各設定項目を書きます。

このノートには、systemd サービスファイルの書き方をまとめています。

サービスファイルの基本構造

サービスファイルには、以下のような構造となっています:

[Unit]
Description=...
After=...

[Service]
ExecStart=...
ExecStop=...
User=...
WorkingDirectory=...

[Install]
WantedBy=...

Unit セクション

Description

サービスの概要。systemctl status などのコマンド実行時に表示されるため、サービスの目的を分かりやすく記述します。

Description=My Custom Service

After

指定したユニットが開始された後に、このサービスが起動。例えば、ネットワークが必要なサービスの場合、network.target を指定。

After=network.target

Requires

このサービスが依存する他のユニットを指定。指定されたユニットが起動しない場合、このサービスも起動されません。

Requires=network-online.target

Wants

Requires に似ていますが、依存関係のユニットが起動に失敗しても、このサービス自体の起動には影響しません。

Wants=network-online.target

Before

指定されたユニットが起動する前に、このサービスを起動。これは、サービスの依存関係を制御するために使います。

Before=multi-user.target

Conflicts

指定されたユニットと同時に起動してはならないことを示します。これにより、サービスが競合しないように制御。

Conflicts=shutdown.target

Service セクション

ExecStart

サービスが開始された際に実行するコマンドを指定。多くの場合、デーモンプロセスやスクリプトの起動を指示します。

ExecStart=/usr/bin/python3 -m http.server

ExecStop

サービスが停止した際に実行するコマンドを指定。通常は、サービスを終了させるためのシグナルを送るか、停止スクリプトを実行。

ExecStop=/bin/kill $MAINPID

ExecReload

サービスの設定をリロードする際に実行するコマンドを指定。多くの場合、SIGHUP シグナルを送信して設定の再読み込みを行います。

ExecReload=/bin/kill -HUP $MAINPID

Type

サービスの起動方法を指定。主なオプションは以下の通り:

  • simple: デフォルトで、ExecStart で指定したプロセスを即座に起動。
  • forking: サービスがバックグラウンドで動作する場合に使用。プロセスがフォークする場合に指定。
  • oneshot: 短時間で終了するスクリプトなどのサービスに使用。
  • notify: サービスが起動完了を systemd に通知する場合に使用。
  • idle: 他のタスクが終了してから実行。
Type=simple

Restart

サービスが終了した際に自動的に再起動するかどうかを指定。以下のオプションがあります:

  • no: 再起動しません(デフォルト)。
  • always: サービスが終了するたびに再起動。
  • on-failure: 異常終了時のみ再起動。
  • on-abort: シグナルによる異常終了の場合のみ再起動。
Restart=always

RestartSec

サービスが再起動する際の待機時間を秒単位で指定。再起動を行う場合、サービスを再起動する前にどのくらいの時間待機するかを設定できます。

RestartSec=5

User

サービスを実行するユーザーを指定。通常、root 権限で実行するのは避け、非特権ユーザーを指定します。

User=www-data

Group

サービスを実行する際のグループを指定。User と同様に、適切なグループを指定することでセキュリティに気をつけます。

Group=www-data

WorkingDirectory

サービスが実行される際の作業ディレクトリを指定。多くの場合、サービスが依存するファイルやデータが存在するディレクトリを指定します。

WorkingDirectory=/var/www/html

Environment

サービスの環境変数を指定。複数の変数を指定することもできます。

Environment="VAR1=value1" "VAR2=value2"

EnvironmentFile

環境変数をファイルから読み込むことができます。指定されたファイルに環境変数が定義されていれば、それを使用。

EnvironmentFile=/etc/myapp/env

TimeoutStartSec

サービスの開始にかかる最大時間を指定。この時間内にサービスが起動しない場合、失敗と見なします。

TimeoutStartSec=30

TimeoutStopSec

サービスの停止にかかる最大時間を指定。この時間内にプロセスが停止しない場合、強制終了します。

TimeoutStopSec=30

Install セクション

WantedBy

このサービスが依存するターゲット(ユニットのグループ)を指定。通常、multi-user.targetgraphical.target に関連付けて、起動時に自動的に有効になるようにします。

WantedBy=multi-user.target

RequiredBy

このユニットが必須となるターゲットや他のユニットを指定。この設定により、依存先が起動していなければ、このユニットも起動しません。

RequiredBy=another-service.target

Alias

このサービスに別名を付けます。別名での呼び出しや管理を可能にします。

Alias=myservice-alias

その他の設定項目

RemainAfterExit

Type=oneshot の場合に、サービスが終了した後もアクティブなままにするかどうかを指定。

RemainAfterExit=yes

ExecStartPre

ExecStart が実行される前に、前処理として実行されるコマンドを指定。前提条件を確認したり、準備を行うために使用します。

ExecStartPre=/usr/bin/pre-task

ExecStartPost

ExecStart 実行後に実行するコマンドを指定。サービスが正常に起動した後の後処理に使います。

ExecStartPost=/usr/bin/post-task

さいごに

サービスファイルを作成した後、忘れずに sudo systemctl daemon-reload コマンドを実行して systemd に変更を反映させます。

sudo systemctl daemon-reload
Posted :