Я запускаю пару сценариев для управления точечно-матричным отображением при загрузке 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=
директива.