Назад | Перейти на главную страницу

Запуск сценария python с systemd при загрузке не выполняется, но ручной запуск работает нормально

Я запускаю пару сценариев для управления точечно-матричным отображением при загрузке Pi 3 B. Сценарий nodejs просто записывает файл изображения в путь. Скрипт python вызывает Adafruit_RGBmatrix для отправки изображения на дисплей. Nodejs отлично работает при загрузке. Сценарий python может привести к сбою всего пи при запуске при загрузке, но он отлично работает при запуске вручную с помощью systemctl.

python: dashboard.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 dashboard_display.service

[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

Когда я запускаю dashboard_display.service, используя systemctl start dashboard_display.service он работает несколько дней. Запуск его при загрузке после включения, он каким-то образом приводит к сбою pi.

Я попытался настроить некоторые задержки при перезагрузке и пробовал различные значения After и Require. Также обернул скрипт python в try /, за исключением того, чтобы он мог спать и повторить попытку.

Я не получаю журналы, но похоже, что он слишком быстро выходит из строя слишком много раз, и пи вылетает.

Есть ли лучший способ обеспечить запуск этих служб, когда все будет доступно? И служба python не запустится, пока служба nodejs не будет выполнена?

В вашем вопросе отсутствует некоторая информация, но я предполагаю, что закомментированный #Requires=dashboard_png.service это скрипт nodejs, который предполагает создание dashboard.png файл. Кроме того, пропуская описание "аварии", я могу только предположить, что она вызвана либо dashpoard.png вообще не существует или записывается nodejs, пока pythin пытается читать с него.

Сделав эти два предположения, я бы предложил попробовать добавить 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= директива.