Help us understand the problem. What is going on with this article?

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/

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした