Debian jessieでinitシステムがSystemdが採用されていますが、その流れでRaspbian JessieでもSystemdが使えるようになっていました。
ということで、自動起動の設定をしてみたいと思います。
serviceファイルの作成
下記のような「xx.service」ファイルを/etc/systemd/system
配下におきます。
(下記の例では「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/