2021年6月5日土曜日

systemdのuserモードでデーモン化をする。

Raspberry Piと人感センサーを使って「イノシシ避けマシン」を作ってみました。無事に完成しまして、イノシシが多く出現し始めるもち米の乳熟期前から設置をしようかと考えています。

後ほど、「イノシシ避けマシン」の作り方も投稿しますが、まずは、いろいろ突っかかったポイントがあったので、備忘録として書いておこうと思います。


***

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)日々更新中です。