Python 腳本在重新啟動/啟動 Raspberry Pi 時無法正確啟動

Python 腳本在重新啟動/啟動 Raspberry Pi 時無法正確啟動

作為上下文,我使用的是 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,樹莓派啟動時沒有任何反應。

該程式不一定需要在桌面自動登入中運行,因此如果控制台版本中有可能的修復也可以。我目前只是採用這種方式,因此更容易檢查程式是否按預期工作。

我也嘗試過使用 crontab,但重啟後沒有任何反應。末尾不帶或不帶“&”。

答案1

我認為正在發生的事情是這樣的:

您的電腦啟動,顯示伺服器啟動,並且您的服務已啟動。但pi尚未登錄,因此第一次無法啟動。您Restart=alwaysRestart=10s確保它嘗試每 10 秒啟動一次,而且確實如此!但不知何故,你的主要進程正在退出並且Restart=不斷觸發。

這是解決它的一個想法:

將服務移至用戶總線。這也意味著您不需要定義DISPLAYXAUTHORITY或 ,User=因為它們是隱式的。然後將該[Install]部分更改為WantedBy=graphical-session.target.新增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

相關內容