Files
screen_cast/systemd/screencast-receiver.service
T
fegger 47905004eb build: make the receiver service headless-console ready
The receiver does not need a window manager: SDL3's KMSDRM backend
renders straight to the kernel display pipeline, which is the right
setup for a small-board appliance. But a systemd system service has
no controlling terminal, and SDL's KMSDRM backend expects one for
its VT handling — so the headless path would have failed at boot.
Give the unit StandardInput=tty with TTYPath=/dev/tty1 (harmless in
desktop mode), and document the headless recipe in the unit, the
install script output, and the RUNBOOK: Raspberry Pi OS Lite with
Console Autologin, no desktop enabled (a compositor would hold the
DRM master), and consoleblank=0.
2026-09-07 13:11:02 +02:00

59 lines
2.2 KiB
Desktop File

# screencast-receiver.service — autostart for the receiver.
#
# This file is a template: scripts/install-receiver.sh substitutes
# __SC_RECEIVER_BIN__ and __SC_RECEIVER_USER__ before installing it to
# /etc/systemd/system/screencast-receiver.service.
#
# Display environments:
#
# 1. Headless console (SDL renders via KMSDRM): works as installed. The
# configured User needs access to /dev/dri and the input devices; the
# install script adds it to the video/render/input groups.
#
# 2. Graphical session (Wayland or X11 desktop with autologin): uncomment
# the Environment lines in [Service] and adjust them to the session
# owner (XDG_RUNTIME_DIR usually lives in /run/user/1000).
[Unit]
Description=Screencast receiver (H.264 over RTP/UDP)
Wants=network-online.target
After=network-online.target avahi-daemon.service
# Give slow-booting boards (and desktop sessions that start late) a chance;
# systemd's default limit would give up after 5 fast failures.
StartLimitIntervalSec=30
StartLimitBurst=10
[Service]
Type=simple
User=__SC_RECEIVER_USER__
ExecStart=__SC_RECEIVER_BIN__ --receive
# SDL's KMSDRM backend (headless console) expects a controlling terminal
# for its VT handling; system services have none by default. Harmless in
# desktop mode, where the process never touches the tty.
StandardInput=tty
TTYPath=/dev/tty1
# SIGTERM (systemctl stop) shuts the receiver down gracefully, which
# withdraws its mDNS announcement. Never SIGKILL it; the systemd default
# KillMode escalates only after the graceful timeout.
KillSignal=SIGTERM
TimeoutStopSec=10
Restart=on-failure
RestartSec=3
NoNewPrivileges=true
PrivateTmp=true
# Graphical session: uncomment and adjust to the session owner.
#Environment=XDG_RUNTIME_DIR=/run/user/1000
#Environment=WAYLAND_DISPLAY=wayland-0
#Environment=DISPLAY=:0
[Install]
WantedBy=multi-user.target
# Headless console recipe (no window manager needed — SDL renders directly
# to the kernel via KMSDRM):
# * Raspberry Pi OS Lite, no desktop enabled (a running compositor would
# hold the DRM master and the receiver could not take it)
# * raspi-config → System Options → Boot → Console Autologin
# * disable console blanking: add consoleblank=0 to
# /boot/firmware/cmdline.txt