はじめに
systemdのサービスファイルである「ユニットファイル」について調べた内容をまとめます。
systemdとは
Linuxの初期化プロセスの一つで、サービスの起動・管理を行う仕組み。多くのLinuxディストリビューションで標準採用されている
基本構成
各セクションの意味
セクション名 |
設定内容 |
Unit |
ユニットの説明や依存関係を設定する |
Service |
サービスの実行方法や挙動を設定する |
Install |
ユニットがsystemctl enableコマンドを実行したときにどのターゲットに関連付けるかを指定する |
※「ユニット」はsystemdが管理する「リソースの単位」
※「サービス」はユニットの一種で、主にバックグラウンドプロセスやデーモンを管理するユニット
[Unit]セクション
オプション名 |
設定内容 |
Description |
サービスの説明。ユニットが何をするものかを説明する |
After |
起動の順序。指定先が準備された後にユニットを起動する |
Before |
起動の順序。指定先が準備される前にユニットを起動する |
Requires |
強い依存関係。指定先が無ければ、ユニットは起動できない |
Wants |
弱い依存関係。指定先が無くても、ユニットは起動できるが、できれば起動してほしい |
[Unit]
Description=My Application Service
After=network.target
[Service]セクション
オプション名 |
設定内容 |
ExecStartPre/Post |
サービス起動前/後に実行するコマンド |
ExecStart |
サービス起動時に実行するコマンド(必須) |
ExecStop |
サービス停止時に実行するコマンド |
ExecStopPost |
サービス停止後に実行するコマンド |
ExecReload |
サービス再読み込み時に実行するコマンド |
Restart |
サービスが停止したときの再起動ポリシー |
RestartSec |
再起動までの待ち時間(秒) |
User |
サービスを実行するユーザー |
Group |
サービスを実行するグループ |
WorkingDirectory |
サービス起動時の作業ディレクトリ |
Environment |
環境変数の設定(例:Environment="VAR=value") |
EnvironmentFile |
環境変数を読み込むファイル |
TimeoutStartSec |
サービス起動時のタイムアウト時間 |
TimeoutStopSec |
サービス停止時のタイムアウト時間 |
Type |
サービスの起動タイプ |
値 |
挙動 |
no |
デフォルト値。再起動しない |
on-success |
正常終了(終了コード0)のときに再起動 |
on-failure |
異常終了(終了コード≠0、シグナル終了、タイムアウトなど)のときに再起動 |
always |
常に再起動(正常・異常問わず) |
値 |
挙動 |
simple |
デフォルト値。 ExecStart で指定したプロセスがそのままサービス本体となり、ExecStart が終了するまでサービスは起動中とみなされる |
forking |
バックグラウンドに移行する。通常、デーモン化するプロセスに使われる |
oneshot |
一回だけコマンドを実行して終了する |
notify |
サービスの起動完了を systemd に通知する |
idle |
他のサービスの起動が終わるまで待ってから実行する |
[Service]
ExecStart=/usr/bin/myapp
Restart=always
User=myuser
WorkingDirectory=/home/myuser/myapp
[Install]セクション
オプション名 |
設定内容 |
WantedBy |
指定したターゲットに「必要とされている(Wanted)」関係を作る。enable 時にそのターゲットの wants/ に symlink が作られる |
RequiredBy |
指定したターゲットに「必須(Required)」関係を作る。失敗するとターゲットごと止まる可能性がある |
Alias |
ユニットに別名(別のユニット名)を付けられる。enable 時に別名でも使えるようになる |
Also |
一緒に有効化(enable)または無効化(disable)される他のユニット名を指定 |
DefaultInstance |
テンプレートユニット(@ 付きユニット)で、デフォルトのインスタンス名を指定 |
ターゲット名 |
説明 |
multi-user.target |
CLI(コンソール)向けサービスのターゲット。一般的な常駐サービス向けで、、複数のユーザーが同時にログイン可能な状態(GUIなし)でシステムを起動する、ターゲットはネットワークが接続されて、ユーザーがログインできるようになった状態を指す |
graphical.target |
GUI(デスクトップ環境)向けのサービスを含むターゲット |
network-online.target |
ネットワーク完全接続後に必要なサービス向け |
※「ターゲット」は複数のサービスをまとめたグループ
※network.target は単にネットワークが「接続された」状態を示すが、network-online.target は「完全に利用可能な状態」を示す
WantedBy=multi-user.target
- systemctl enable xxx.serviceの実行すると、/etc/systemd/system/multi-user.target.wants/xxx.service にシンボリックリンクが貼られる
- シンボリックリンクにより、multi-user.targetが起動する際にxxx.serviceが自動的に起動されるようになる