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-daemon
und ü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 defaults
das 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.target
Runlevel 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.