Öffnen Sie beim Booten von Linux ein grafisches Programm mit systemd unter einem Weston/Wayland-Compositor

Öffnen Sie beim Booten von Linux ein grafisches Programm mit systemd unter einem Weston/Wayland-Compositor

Das wollen:Öffnen eines Programms beim Booten in einem Weston-Compositor

Was ich versucht habe: Erstellen eines SysV-Init-Skripts mit niedriger Priorität

Was funktioniert: Weston startet, aber mein Programm nicht

Hallo, ich arbeite an einem Programm in einer eingebetteten Umgebung. Das Programm basiert auf Qt und ich möchte, dass es beim Hochfahren des Geräts ausgeführt wird. Dieses Gerät verwendet eine Debian-ähnliche Distribution, mit der Ausnahme, dass beim Hochfahren direkt ein Weston-Compositor und nicht ein Login/Desktop gestartet wird.

Bisher habe ich ein Standardskript /etc/init.d(siehe unten) erstellt, das mein Programm mit startet start-stop-daemonund über einen einfachen Start-Stopp-Schalter verfügt. Dies funktioniert, wenn es manuell aufgerufen wird. Wenn es jedoch mit aufgerufen wird, wird update-rc.d appService defaultsdas Programm beim Booten nicht gestartet.

Wenn ich versuche, den automatisch generierten Dienst ( systemctl start appService) manuell zu starten, erhalte ich einen XDG_RUNTIME_DIR-Fehler. Was??? Warum steht mir X im Weg?

Bei der Untersuchung der von systemd automatisch generierten Servicedatei (siehe auch unten) stellt sich heraus, dass das Programm ausgeführt werden möchte, bevor der multi-user.targetRunlevel erreicht wurde.

Das Drehbuch

#!/bin/sh

DIR="/home/root"
DAEMON=$DIR/appname
DAEMON_OPTS=""
DAEMON_NAME="APP"
PIDFILE=/var/run/$DAEMON_NAME.pid
DAEMON_USER="root"

case "$1" in
  start)
    echo "Starting $DAEMON_NAME"
    ifconfig eth1 192.168.1.233
    start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --exec $DAEMON -- $DAEMON_OPTS
    ;;
  stop)
    echo "Stopping $DAEMON_NAME"
    start-stop-daemon --stop --pidfile $PIDFILE --retry 10
    ;;
  *)
    echo "Usage: /etc/init.d/appService {start|stop}"
    exit 1
    ;;
esac

exit 0

Die Servicedatei:

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/init.d/appService
Before=multi-user.target
Before=multi-user.target
Before=multi-user.target
Before=graphical.target
Before=shutdown.target
Before=umountnfs.service
Before=rng-tools.service
Before=thermal-zone-init.service
Before=gdbserverproxy.service
After=dropbear.service
After=tiipclad-daemon.service
After=telnetd.service
After=rc.pvr.service
After=uim-sysfs.service
After=alignment.service
Conflicts=shutdown.target

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
ExecStart=/etc/init.d/appService start
ExecStop=/etc/init.d/appService stop

Wenn ich versuche, den Dienst manuell zu starten ( systemctl start appService), erhalte ich einen XDG_RUNTIME_DIR-Fehler. Was??? Warum steht mir X im Weg?

Wie kann ich dieses Skript reparieren? Ich möchte, dass es nach dem Start des Weston-Compositors gestartet wird.

Antwort1

X11 erfordert die Festlegung einiger Umgebungsvariablen, damit Apps unter X11 ordnungsgemäß gestartet werden können. Haben Sie bestätigt, welche Umgebungsvariablen festgelegt werden müssen, um Apps unter Weston zu starten?

Meiner Erfahrung nach ist es für den automatischen Start grafischer Apps besser, die Funktion „Apps starten“ einer Desktopumgebung zu verwenden als systemd. In diesem Design sind die richtigen Umgebungsvariablen bereits für Sie festgelegt.

verwandte Informationen