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

相关内容