3.2 systemdを利用したサービス管理 #
Ubuntuでは、サービス管理機能としてsystemdが採用されています。そのため、ユーザーが用意したアプリケーションについてもsystemdのサービスタイプのユニットファイルを用意することで起動管理することが可能です。
ここでは、『1.3.2 クロスビルドの実行』のサンプルプログラムamnimo-sample-appをサービスとする場合に、systemdのユニットファイルを作成する方法について説明します。
3.2.1 ユニットファイルの作成 #
amnimo-sample-appのユニットファイル(amnimo-sample-app.service)を、/etc/systemd/system配下に作成します。
補足: 以前の版の本書では /lib/systemd/system 配下に作成していました。/lib/systemd/system(Ubuntu 24.04 LTS では /usr/lib/systemd/system)はパッケージがユニットファイルを置く場所です。手作業で作成するユニットファイルは、/etc/systemd/system 配下に置くのが一般的です。deb パッケージに含める場合は『3.3 パッケージの作成をする』を参照してください。
注意: /etc/systemd/system と /lib/systemd/system はどちらも rootfs 領域にあるため、ユニットファイルはファームウェアの全体更新で削除されます。全体更新の後も使う場合は、ユニットファイル、実行ファイル、自動起動の設定(
systemctl enableで作成されるシンボリックリンク)を /etc/amnimo/archive.list に登録して保存してください(『2.3 アプリケーションをファームウェア更新後も残す』)。
amnimo-sample-app.service
[Unit]
Description=amnimo sample application
After=syslog.target network.target amnimo-amsrv.service
RequiresMountsFor=/media/ssd
[Service]
Type=simple
ExecStart=/usr/sbin/amnimo-sample-app
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Unitセクション
ユニットの説明、依存関係、順序関係など、ユニットのタイプに依存しない項目を記載します。
| パラメーター | 内容 | サンプルの設定例 |
|---|---|---|
| Description | プログラムに関する説明を記載します。 | amnimo sample application |
| After | 指定したユニットリストが起動したあとに、本ユニットを実行します。 | syslog.target syslogにログを保存するために、syslogのあとに本サンプルプログラムを起動します。 network.target ネットワーク接続を前提とする場合は、追記します。 amnimo-amsrv.service アムニモのサービス制御(アムニモ設定情報に従ってアムニモの各サービスを起動する)の後に起動します。アムニモ自身のサービス(amnimo-dimoni など)も同じ指定をしています。 |
| RequiresMountsFor | 本ユニットの動作に必要なマウントポイントを指定します。 | /media/ssdのマウント完了を待ちます。 SSDを使わない場合は、この行を削除します。 |
Serviceセクション
サービスユニット固有の設定を記載します。
| パラメーター | 内容 | サンプルの設定例 |
|---|---|---|
| Type | サービスユニットの起動方法を指定します。 | simple プロセスが開始した時点で本ユニットサービスが開始したと判断します。 |
| ExecStart | サービスを起動するコマンドを指定します。 | /usr/sbin/amnimo-sample-app (本サンプルコマンド) |
| Restart | サービスのプロセスが停止した場合の再起動条件を設定します。 | always 終了理由に関わらず再起動します。 |
| RestartSec | サービスを再起動する場合、サービス停止後、再起動するまでの時間を指定します。 | 5秒 |
Installセクション
指定したターゲットの自動起動を有効化したときにユニットが起動するように、依存関係を記載します。
| パラメーター | 内容 | サンプルの設定例 |
|---|---|---|
| WantedBy | サービスユニットをenableにしたときに、設定したユニットの.wantsディレクトリにユニットファイルのリンクが作成されます。 | multi-user.target (複数ユーザー環境用のターゲット、SysVinitのランレベル2~4に相当) |
補足: プログラムが標準出力に書いた内容は journal(
sudo journalctl -u amnimo-sample-app)に記録されます。標準出力が端末でない場合、C 言語のprintfの出力はバッファーにためられ、すぐには記録されません。すぐに記録したい場合は、出力の後にfflush(stdout)を呼んでください。
補足: ユニットファイルを修正したら、
systemd-analyze verify ユニットファイルのパスで書式の誤りがないかを確認できます(例: 全角の「=」を使うとMissing '='と表示され、その行は無視されます)。
補足: ユニットファイルをカスタマイズする場合は、以下のサイトを参照してください。
ユニットファイル
https://www.freedesktop.org/software/systemd/man/systemd.unit.htmlサービスユニット
https://www.freedesktop.org/software/systemd/man/systemd.service.html
3.2.2 サービスの状態制御と状態管理 #
作成したサービスユニットを起動し、動作確認します。
ユニットファイル修正後の操作
ユニットファイルを修正した場合は、以下のコマンドを実行し、設定内容を反映する必要があります。
実行環境: エッジゲートウェイ
admin@amnimo:~$ sudo systemctl daemon-reload
サービスユニットの起動と状態確認
サービスを起動する場合は、以下のように実行します。
実行環境: エッジゲートウェイ
admin@amnimo:~$ sudo systemctl start amnimo-sample-app
サービスユニットが正常に起動しているかどうかは、以下のように確認することができます。
実行環境: エッジゲートウェイ
admin@amnimo:~$ sudo systemctl status amnimo-sample-app
● amnimo-sample-app.service - amnimo sample application
Loaded: loaded (/lib/systemd/system/amnimo-sample-app.service; disabled; vendor preset: enabl
Active: active (running) since Wed 2020-08-19 18:22:05 JST; 10s ago
Main PID: 30823 (amnimo-sample-a)
CGroup: /system.slice/amnimo-sample-app.service
└─30823 /usr/sbin/amnimo-sample-app
・・・
補足: 実行例はファームウェア Ver.1(Ubuntu 18.04 LTS)で /lib/systemd/system に置いた場合の出力です。ファームウェア Ver.3(Ubuntu 24.04 LTS)では、
vendor preset:はpreset:と表示されます。Active: active (running)と表示されていれば、正常に起動しています。
ユニットの有効化/無効化
システム起動時に自動起動したい場合は、ユニットを有効化します。
実行環境: エッジゲートウェイ
admin@amnimo:~$ sudo systemctl enable amnimo-sample-app
ユニットを無効化する場合は、以下のように実行します。
実行環境: エッジゲートウェイ
admin@amnimo:~$ sudo systemctl disable amnimo-sample-app

補足: 以前の版の本書では /lib/systemd/system 配下に作成していました。/lib/systemd/system(Ubuntu 24.04 LTS では /usr/lib/systemd/system)はパッケージがユニットファイルを置く場所です。手作業で作成するユニットファイルは、/etc/systemd/system 配下に置くのが一般的です。deb パッケージに含める場合は『
注意: /etc/systemd/system と /lib/systemd/system はどちらも rootfs 領域にあるため、ユニットファイルはファームウェアの全体更新で削除されます。全体更新の後も使う場合は、ユニットファイル、実行ファイル、自動起動の設定(