RaspberryPi
raspbian
Jessie

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

More than 1 year has passed since last update.

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/