前回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歩ずつですが、どんどんラズパイが自分の思い通りになってきました。