ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

systemdのサービスの起動順序を決める

hoge1.serviceとhoge2.serviceという2つのサービスを作成しました。
「hoge1.seriveのExecStartで指定したスクリプトが完全に終了してからhoge2.serviceを起動する」ということをしたい場合は、サービスの起動順序を記述する必要があります。

[Unit]セクションにAfterとBeforeを記述すれば起動順序を指定できますが、これだけだと意図した順序で起動してくれませんでした。
原因は起動完了判定のタイミングで、[Service]セクションのTypeも考える必要があります。

Type = simpleは、「サービス起動と同時に起動完了と判定する」
Type = oneshotは、「サービス起動して、ExecStartで指定したスクリプトが終了したら起動完了と判定する」
Systemd入門(4) - serviceタイプUnitの設定ファイル - めもめも


なので、今回のような場合はhoge1.serviceをType = oneshotにする必要があります。

hoge1.service

[Unit]
Description = hoge1.sh runs before hoge2.sh
Wants = multi-user.target
Before = hoge2.service

[Service]
ExecStart = /home/pi/hoge1.sh
Restart = no
Type = oneshot

[Install]
WantedBy = multi-user.target

hoge2.service

[Unit]
Description = hoge2.sh runs after hoge1.sh
After = hoge1.service

[Service]
ExecStart = /home/pi/hoge2.sh
Restart = no
Type = simple

[Install]
WantedBy = multi-user.target

実際に意図した順序で起動しているかを確認してみます。
Systemdのサービスの依存関係を調べる方法 - ククログ(2015-12-28)

$ systemd-analyze plot > systemd.svg

作成されたsystemd.svgファイルを適当なブラウザにドラッグ&ドロップすると、デーモンの起動順序を確認できます。
f:id:takeg:20170215220336p:plain
hoge1.serviceの後にhoge2.serviceがactiveしていることがわかります。
どうやらこれで良さそうです:)