作為上下文,我使用的是 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=always
並Restart=10s
確保它嘗試每 10 秒啟動一次,而且確實如此!但不知何故,你的主要進程正在退出並且Restart=
不斷觸發。
這是解決它的一個想法:
將服務移至用戶總線。這也意味著您不需要定義DISPLAY
、XAUTHORITY
或 ,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