LoginSignup
7
0

More than 1 year has passed since last update.

Raspberry Pi でsystemdにサービス登録すると音が出なくなる現象の対処法

Last updated at Posted at 2022-07-14

どんな現象か

mp3を再生するPythonプログラムを作成し、それをpython test.pyのように実行する場合は問題なく音が出ますが、
自動起動するためにsystemdにサービス登録したところ、音が鳴らなくなってしまいました。

ユニットファイルは以下のような内容。

[Unit]
Description=Test
After=network.target

[Service]
User=pi
ExecStart=/usr/bin/python3 /home/pi/test.py
WorkingDirectory=/home/pi

[Install]
WantedBy=multi-user.target

何が問題か?

PulseAudioという音を鳴らすためのサウンドサーバシステムが、rootユーザからは参照できないようになっているため。

ユニットファイルでUser=piのように指定していても、それはExecStartで指定したプロセスをpiユーザで起動するという意味であって、
サービス自体の起動はrootユーザによって行われます。

対処方法1

サービスの起動を非rootユーザで行います。

systemctl --user enable test.serviceのような形でサービス登録すればOK。

ユニットファイルの置き場所など他にもいくつかの設定があるので、詳しくは以下の記事を参考に。
サーバー起動時に非rootユーザでsystemdを使ってサービスを立ち上げる

ただし、この方法だと非rootユーザーのユニットとしか依存関係を設定できないらしいです。
今回はAfter=network.targetと指定している通り、ネットワークの接続後に動かしたかったので、この方法は使えませんでした。。。

対処方法2

ユニットファイルに、環境変数XDG_RUNTIME_DIRの設定を追記。

[Unit]
Description=Test
After=network.target

[Service]
User=pi
ExecStart=/usr/bin/python3 /home/pi/test.py
WorkingDirectory=/home/pi
Environment="XDG_RUNTIME_DIR=/run/user/1000"

[Install]
WantedBy=multi-user.target

[Service]セクションにEnvironment="XDG_RUNTIME_DIR=/run/user/1000"を追記しています。

1000となっている部分はUID。
ラズパイで最初に作ったユーザのUIDは1000になるっぽいですが、念のためidコマンドでUIDを確認したほうが良いかもしれません。

こちらの方法で、rootユーザからのサービス起動でも無事に音が鳴るようになりました!

7
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0