Raspbian jessieでSystemdを使った自動起動

Debian jessieでinitシステムがSystemdが採用されていますが、その流れでRaspbian JessieでもSystemdが使えるようになっていました。
ということで、自動起動の設定をしてみたいと思います。

# serviceファイルの作成

下記のような「xx.service」ファイルを```/etc/systemd/system```配下におきます。
（下記の例では「moviestream.service」とします。）

```moviestream.service
[Unit]
Description = Movie Streaming

[Service]
ExecStart=/home/pi/systemd/mjpgstreamer.sh
Restart=always
Type=simple

[Install]
WantedBy=multi-user.target
```

※配置先は```/usr/lib/systemd/system```以下でもOKですが、システム設定のものが多いらしい。
ユーザ設定のものは```/etc/systemd/system```以下に置くのがお作法っぽい。

記載内容について、もう少し詳しく書いていきます。

## Unit
systemdでは、管理単位を「Unit」と言います。
このセクションには下記のような、概要、依存関係、起動順について記載します。

+ 概要
 + Description: Unitの説明
+ 依存関係
 + Required: 前提条件となるUnitの指定。指定のUnitの起動に失敗すると、このUnitも起動しません。
 + Wants: 前提条件となるUnitの指定。ただし、Requiredと違って、指定のUnitの起動に失敗しても、このUnitの起動を試みます。
+ 順序
 + After: 記載したUnitの後に起動
 + Before: 記載したUnitの前に起動

## Service
下記のようなサービスの制御について記述します。

+ ExecStart: サービス起動コマンド
+ ExecReload: サービスリロードコマンド
+ ExecStop: サービス停止コマンド
+ ExecStartPre/ExecStartPost: サービス起動前後の追加コマンド（サービス起動判定には関連させたくないコマンドを記載）
+ ExecStopPost: サービス停止後に実行するコマンド（サービスが異常停止した際にも実行される）
+ Type: サービスプロセスの起動完了の判定方法。デフォルトは「simple」。
 + 「simple」: ExecStartで指定したコマンドを実行した時点でサービスが立ち上がったと判断
 + 「oneshot」: ExecStartで指定したコマンドを実行し、それが完了した時点で起動完了（かつサービス終了）と判断
 + 「forking」: ExecStartで指定したコマンドからプロセスが一旦フォークし、親プロセス側が終了したときに、サービスが立ち上がったと判断
+ Restart: サービスプロセス停止時の再起動条件（デフォルトは「no」）
 + 「always」: 常に再起動を試みる
 + 「no」: 再起動しない
 + 「on-success」: 終了コード0の場合に再起動を試みる
 + 「on-failure」: 終了コード0外の場合に再起動を試みる

## Install
このセクションを書かないとデーモンとして動いてくれません。

+ WantedBy: 有効時にこのUnitの.wantsディレクトリにリンクを作成する
+ RequiredBy: 有効時にこのUnitの.requiredディレクトリにリンクを作成する
+ Also: 有効化/無効化時に同時に有効化or無効化するUnit

Unitセクションで設定したWant/Required依存関係はWantedBy/RequiredByのディレクトリで判断されます。

Wants/Requiredはカスタマイズも可能ですが、いわゆるデーモンのrunレベルに合わせて設定するものが決まっています。

+ 「poweroff.target」: runレベル0相当
+ 「rescue.target」: runレベル1相当
+ 「multi-user.target」: runレベル2〜4相当
+ 「graphical.target」: runレベル5相当
+ 「reboot.target」: runレベル6相当

# 登録確認

正しく設定できているか確認する。

```
# systemctl list-unit-files --type=service

UNIT FILE                              STATE   
(略)
moviestream.service                    disable  
(略)
```

なお、```moviestream```と指定している部分は、前に作成した「xx.service」の「xx」の部分を指定します。（以下も同様です。）

上記の表示が確認できれば、うまくいっているはず。

# サービスの起動確認
デーモン登録の前に、起動停止を確認する

```
# systemctl start moviestream （※起動時）
# systemctl stop moviestream　（※停止時）
```

statusを指定すると、状況がみれます。下記は起動時。Activeの欄が確認ポイント。
```
# systemctl status moviestream 
● moviestream.service - Movie Streaming
   Loaded: loaded (/etc/systemd/system/moviestream.service; enabled)
   Active: active (running) since 日 2016-02-21 03:35:45 JST; 9h ago
 Main PID: 543 (mjpgstreamer.sh)
   CGroup: /system.slice/moviestream.service
           ├─543 /bin/bash /home/pi/systemd/mjpgstreamer.sh
           └─562 /home/pi/mjpgstreamer/mjpg-streamer/mjpg-streamer-experiment...

 2月 21 03:35:45 raspberrypi mjpgstreamer.sh[543]: o: www-folder-path...: /h...
 2月 21 03:35:45 raspberrypi mjpg_streamer[562]: MJPG-streamer [562]: www-fo...
 2月 21 03:35:45 raspberrypi mjpg_streamer[562]: MJPG-streamer [562]: HTTP T...
 2月 21 03:35:45 raspberrypi mjpg_streamer[562]: MJPG-streamer [562]: userna...
 2月 21 03:35:45 raspberrypi mjpg_streamer[562]: MJPG-streamer [562]: comman...
 2月 21 03:35:45 raspberrypi mjpg_streamer[562]: MJPG-streamer [562]: starti...
 2月 21 03:35:45 raspberrypi mjpg_streamer[562]: MJPG-streamer [562]: starti...
 2月 21 03:35:45 raspberrypi mjpgstreamer.sh[543]: o: HTTP TCP port.....: 8081
 2月 21 03:35:45 raspberrypi mjpgstreamer.sh[543]: o: username:password.: di...
 2月 21 03:35:45 raspberrypi mjpgstreamer.sh[543]: o: commands..........: en...
Hint: Some lines were ellipsized, use -l to show in full.
```

# デーモンとして動かすとき
```
# systemctl enable moviestream　（※デーモン起動指定時）
# systemctl disable moviestream　（※デーモン停止指定時）
````



# 参考

下記のサイトがとても参考になりました。
　
https://wiki.archlinuxjp.org/index.php/Systemd
http://equj65.net/tech/systemd-boot/