どんな現象か
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ユーザからのサービス起動でも無事に音が鳴るようになりました!