我正在运行几个脚本来在 Pi 3 B 启动时驱动点阵显示器。nodejs 脚本只是将图像文件写入路径。python 脚本调用 Adafruit_RGBmatrix 将图像发送到显示器。nodejs 在启动时运行良好。python 脚本在启动时可能会导致整个 pi 崩溃,但使用 systemctl 手动启动时运行良好。
python:仪表板.py
import Image
import time
from rgbmatrix import Adafruit_RGBmatrix
# Rows and chain length are both required parameters:
matrix = Adafruit_RGBmatrix(32, 2)
matrix.SetWriteCycles(16)
while True:
try:
image = Image.open("/home/pi/dashboard.png")
image.load()
matrix.SetImage(image.im.id, 0, 0)
time.sleep(10)
matrix.Clear()
except:
print("Dashboard image could not be opened!")
time.sleep(5)
systemd 仪表板_显示.服务
[Unit]
Description=Dashboard Display Driver
#Requires=dashboard_png.service?
After=multi-user.target
[Service]
Type=simple
ExecStart=/usr/bin/python /home/pi/src/drive-display/dashboard.py
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
当我使用仪表盘显示服务运行systemctl start dashboard_display.service
它时,它会运行好几天。在启用后启动时运行它,它不知何故使 pi 崩溃。
我尝试设置一些重启延迟,并尝试了各种 After 和 Require 值。还将 python 脚本包装在 try/except 中以允许其休眠并重试。
我没有收到日志,但似乎它失败的次数极快,并且 pi 崩溃了。
有没有更好的方法可以确保这些服务在一切可用时启动?并且直到 nodejs 服务完成时 python 服务才会启动?
答案1
您的问题中缺少一些信息,但我假设注释掉的#Requires=dashboard_png.service
是应该创建dashboard.png
文件的 nodejs 脚本。此外,由于缺少“崩溃”的描述,我只能假设它是由于dashpoard.png
根本不存在,或者在 pythin 尝试读取时由 nodejs 写入而导致的。
做出了这两个假设之后,我建议尝试添加After=dashboard_png.service
到[Unit]
的部分dashboard_display.service
,并取消注释Requires=dashboard_png.service
。
根据systemd.unit手动的:
需求依赖关系不会影响服务的启动或停止顺序。这必须使用 After= 或 Before= 选项单独配置。如果单元 foo.service 引入单元 bar.service(如使用 Wants= 配置的一样),并且未使用 After= 或 Before= 配置顺序,则如果 foo.service 已激活,则两个单元将同时启动,并且它们之间没有任何延迟。
虽然该引述取自Wants=
指令的描述,但同样适用于该Requires=
指令。