在启动时使用 systemd 运行 python 脚本失败,但手动启动可以正常工作

在启动时使用 systemd 运行 python 脚本失败,但手动启动可以正常工作

我正在运行几个脚本来在 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=指令。

相关内容