ゆるエンジニアはいろいろ遊びたい

FAエンジニアが週末にいろいろ遊ぶブログです

RaspberryPi5 スマホからserviceを動かしてみた

前回Fraskでwebサーバーを立ち上げ、スマホからpythonプログラムを実行することができました。
slowtech.hateblo.jp

今度はserviceを実行したいと思います。
実行するサービスは、wakeup_app.serviceで、Fraskを使ったプログラムは以下の通りです。
ファイル名はserver.py

from flask import Flask
import subprocess

app = Flask(__name__)

@app.route('/start')
def start_program():
    # 仮想環境のpythonで指定のファイルを起動
    subprocess.run([
        "systemctl",
        "start",
        "wakeup_app.service"
    ])
    return "wakeup_app.service を起動しました!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

まずはターミナルから仮想環境に入り、server.pyを実行し、サーバーを立てます。
ブラウザから、http://ラズパイのIP:5000/startにアクセスすると、ターミナルにパスワードを入力するように求められました。
これはユーザーの権限の問題らしく、systemctlはroot権限でしか操作できないためらしいです。
このサービスに関してだけ、通常ユーザーで起動できるようにします。

sudo visudo

で以下を追加

usr ALL=NOPASSWD: /bin/systemctl start wakeup_app.service

そして、server.pyのsubprocess.runを以下のように修正します。

subprocess.run([
    "sudo",
    "systemctl",
    "start",
    "wakeup_app.service"
])

これでパスワードを求められなくなります。
そして、このserver.pyをサービスで常駐させます。

sudo nano /etc/systemd/system/server.service
[Unit]
Description=Run server program

[Service]
Type=simple
User=usr
WorkingDirectory=/home/usr/Documents/python_app
ExecStart=/home/usr/Documents/python_app/.venv/bin/python server.py
Restart=always
[Install]
WantedBy=multi-user.target

保存して閉じたら、有効化します。

sudo systemctl daemon-reload
sudo systemctl enable server.service
sudo systemctl start server.service

これでサービスもFlaskから実行することができるようになりました。
Flaskで直接pythonを動かす事も可能なのですが、場合によっては間に1つサービスを挟んだ方がFlask側がシンプルになると思います。
1歩ずつですが、どんどんラズパイが自分の思い通りになってきました。