後ほど、「イノシシ避けマシン」の作り方も投稿しますが、まずは、いろいろ突っかかったポイントがあったので、備忘録として書いておこうと思います。
***
Raspberry Piで、Pythonによる音声の再生に「pygame」、定期実行に「schedule」モジュールをそれぞれ使っているのですが、systemdによるデーモン化で突っかかりました。
端的に、原因としては、systemdをrootとして使っていたためで、userモード(--user)で使うのが正解でした。ただし、pygameとscheduleは別理由でした。
scheduleは、pipによるインストール時に、root権限で実行していなかったため、「home/pi/.local/lib/python3.7/site-packages」にインストールされていました。以前も同じミスをしていますね(笑)。なので、root権限でインストールすれば、systemdのuserモードでデーモン化をする必要はないです。
pygameに関しては、SDL(Simple DirectMedia Layer)という開発ライブラリ上に構築されているため、何たらかんたら……という理由でしたが(たぶん)、あまりよく理解していません(笑)。とりあえず、rootだと動かないようです。
▼ systemdのuserモードでデーモン化する方法
今回は、「/home/pi/」直下に「Python」フォルダを作成して、そこに「test_daemon.py」を作成している想定です。Pythonスクリプトには、シバン(shebang)を忘れずに。
デーモン化するPythonスクリプトに権限を付与。
$ sudo chmod 755 ./Python/test_daemon.py
次に、ユニットファイル「test_daemon.service」を作成して、「~/.config/systemd/user/」に配置(フォルダが無い場合は作成)。
[Unit] Description = test daemon [Service] ExecStart = /home/pi/Python/test_daemon.py Restart = always Type = simple [Install] WantedBy = default.target
起動。
$ systemctl --user enable test_daemon Created symlink /home/pi/.config/systemd/user/default.target.wants/test_daemon.service → /home/pi/.config/systemd/user/test_daemon.service. $ systemctl --user start test_daemon
再起動後、確認して状態がActiveになっていれば成功です。
$ systemctl --user status test_daemon
systemdのuserモードの説明は、こちら →(systemd/User - ArchWiki)が詳しいです。英語ですが、まるっと翻訳すればだいたいわかります。
Python、入門書も読み切らず、とりあえず雰囲気で使い始めてしまったので、事あるごとに突っかかりますね(笑)。まぁ、別にプログラマーでもないので、その都度調べて、動けばいいやの精神で使っていきたいと思います。
Twitter(@nkkmd)日々更新中です。