Posted at

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

More than 3 years have 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/