作为上下文,我使用的是 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