文脈上、私はRaspberry Piモデル3B+を使用しています。現在、Piが起動したときにPythonスクリプトを実行しようとしています。しかし、プログラムを正しく起動するのに苦労しています。次のサービスファイルを使用すると起動しますが、10秒ごとに再起動され、プログラムが無限に起動します。プログラムを一度だけ始めたいです。
[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=always
してください。Restart=10s
ただし、何らかの方法で主要なプロセスが終了し、Restart=
継続して実行されます。
これを解決するためのアイデアは次のとおりです。
サービスをユーザーバスに移動します。これはまた暗黙的であるためDISPLAY
、XAUTHORITY
またはを定義する必要がないことを意味します。User=
次に、[Install]
そのセクションをWantedBy=graphical-session.target
.Addに変更して、PartOf=graphical-session.target
ユーザーがセッションからログアウトしたときにサービスを停止します。 graphical-session.target
これはユーザーバスでのみ利用可能なターゲットであり、ユーザーがグラフィカルセッションにログインしている場合にのみ発生します。Restart
//RestartSec
何かをするために本当に必要なKillMode
場合にのみ定義するだけですTimeoutSec
(単にプログラムを始めるためではありません)。
これにより、ユーザーがグラフィカルセッションにログインするまでサービスが開始されなくなります(これは以前はサービスが機能しなくなったようです)。
これを行うには、サービスファイルをからに/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