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.target
や graphical.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