Raspberry Pi の再起動/起動時に Python スクリプトが正しく起動しない

Raspberry Pi の再起動/起動時に Python スクリプトが正しく起動しない

コンテキストとして、私は Raspberry Pi モデル 3B+ を使用しています。現在、Pi の起動時に Python スクリプトを実行しようとしています。しかし、プログラムを適切に起動するのに苦労しています。次のサービス ファイルを使用すると、プログラムは起動しますが、10 秒ごとに再起動するため、プログラムが無限に起動されます。プログラムを 1 回だけ起動したいのです。

[Unit]
Description=Start Bling

[Service]
User=pi
Environment=DISPLAY=:0
WorkingDirectory=/home/pi/facial_recognition
Environment=XAUTHORITY=/home/pi/.Xauthority
Environment="prog_path"=/home/pi/facial_recognition
ExecStart=/usr/bin/python /home/pi/facial_recognition/run_on_start.py

Restart=always
RestartSec=10s
KillMode=process
TimeoutSec=infinity

[Install]
WantedBy=graphical.target

しかし、この部分を削除すると:

Restart=always
RestartSec=10s
KillMode=process
TimeoutSec=infinity

または、Restart=on-failure に変更すると、Raspberry Pi の起動時に何も起こりません。

プログラムは必ずしもデスクトップの自動ログインで実行する必要はないので、コンソール バージョンで修正できる場合はそれも問題ありません。現在はこのようにしているので、プログラムが意図したとおりに動作しているかどうかを確認しやすくなります。

crontab の使用も試みましたが、再起動しても何も起こりませんでした。末尾に「&」があってもなくても何も起こりませんでした。

答え1

次のようなことが起こっていると思います:

マシンが起動し、ディスプレイ サーバーが起動し、サービスがアクティブになります。ただし、piまだログインしていないため、初回起動に失敗します。10秒ごとに起動を試行することを確認Restart=alwaysRestart=10s、実際に起動します。しかし、何らかの理由でメイン プロセスが終了し、がRestart=継続的にトリガーされます。

これを解決するためのアイデアは次のとおりです。

サービスをユーザー バスに移動します。これは、、、またはが暗黙的であるため定義する必要がないことも意味しますDISPLAYXAUTHORITY次にUser=[Install]セクションを に変更しますWantedBy=graphical-session.targetPartOf=graphical-session.targetユーザーがセッションからログアウトしたときにサービスを停止するには、 を追加します。は、 ユーザーgraphical-session.targetバスでのみ使用可能なターゲットであり、ユーザーがグラフィカル セッションにログインしている場合にのみ発生します。/ / / は、Restart何かのために本当に必要な場合にのみ定義する必要があります (プログラムを起動するためだけではありません)。RestartSecKillModeTimeoutSec

これにより、ユーザーがグラフィカル セッションにログインする前にサービスが開始されなくなります (これが以前は動作しなかった原因だったと思います)。

そのためには、サービス ファイルを から に移動し/etc/systemd/system//home/pi/.config/systemd/user/bling.service次のようになります。

[Unit]
Description=Bling
PartOf=graphical-session.target

[Service]
WorkingDirectory=/home/pi/facial_recognition
Environment="prog_path"=/home/pi/facial_recognition
ExecStart=/usr/bin/python /home/pi/facial_recognition/run_on_start.py

[Install]
WantedBy=graphical-session.target

次に、systemctl --user enable bling.service

関連情報