Amazon Dash Buttonを使ってLINEに通知する方法を以前書いた。 記事には記載していないが、このときは、init.dを使って自動起動するように設定していた。

最近はinit.dは古くて、Systemdが推奨されているようなので、これに書き換えることにした。

サンプルソース

GitHubのWiki にサンプルソースがあったのでそのまま記載する。

[Unit]
Description=Dasher
After=network.target

[Service]
Type=simple
#user with access to dasher files
User=root
WorkingDirectory=/home/pi/dasher
#use command "which npm" to determine correct location of NPM
ExecStart=/usr/local/bin/npm run start
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

Unitセクション

SystemdではUnitという単位で処理を管理する。 init.dで言うサービスに当たる概念のようだ。

ここではdasherが1つのUnitということになる。

Description

Unitの説明を書く。

After

このUnitが起動するタイミングを記述する。 ここではnetwork.targetの後に実行することになる。

.targetというのは今回のように順序関係や依存関係を定義する際に、複数のUnitをグループ化するために使われる。 network.targetの実体は、/lib/systemd/system/network.targetにあるが、内容を確かめずとも、ネットワーク関連のUnit群であることがわかる(のでこれ以上詳しくは見ない)。

ちなみにSystemdの起動時にはdefault.targetというUnitが有効化されることになっており、これに依存するUnitがまとめて有効化されていく。

Serviceセクション

このセクションはUnitの種類によって異なる。 デーモンを起動する場合には.serviceなのでServiceセクションとなる。他にも上に出てきた.targetや.deviceなどいくつかの種類がある。

Type

サービスプロセスの起動完了の判定方法。 simpleを指定すると、ExecStartで指定したコマンドを実行したタイミングで起動完了とみなす。

起動完了をどう使うかは未調査。上述のAfterなど順序関係のためだろうか。

User

実行ユーザを指定する。rootで実行することになる。

WorkingDirectory

実行時のカレントディレクトリを指定する。 ここではpiユーザーのhomeにdasherを取得したことになっている模様。 通常はセキュリティの観点からもpiユーザー以外にしているはずなので、ここは変更必須。

ExecStart

サービスを起動するコマンド。フルパスじゃないとダメらしい。 このタイミングではまだパスが通ってないのだろうか?

Restart

再起動条件を指定する。on-failureは終了コード0以外で停止した場合に再起動する設定。 ようするに異常終了した時は再起動してねってこと。

RestartSec

再起動する前の待ち時間。Restartの設定と合わせて読むと、異常終了を検知したら10秒後に再起動してねってこと。

KillMode

サービス停止時にプロセスが残っていた場合の処理を指定する。 processはメインプロセスが残っていたらkillする設定。

Installセクション

systemctl enable/disableに関する設定群

WantedBy

init.dで言うrunlevelの指定に相当する。 multi-user.targetはrunlevel 3に相当するので、CUIでログインすると起動することになる。

セットアップ

上の設定を /etc/systemd/system/dasher.serviceに置いて、

systemctl list-unit-files --type=service | grep dasher

すると、dasher.serviceがサービスとして認識されていることがわかる。 この時点ではdisable状態。

続いて自動起動を有効化する。

sudo systemctl enable dasher

してから、先程のコマンドを再送すると、enableに変わっているはず。 この状態で再起動する。そして、

sudo systemctl status dasher

でactive状態になっていればOK