Abra o programa gráfico no Linux na inicialização usando systemd em um compositor Weston/Wayland

Abra o programa gráfico no Linux na inicialização usando systemd em um compositor Weston/Wayland

O querer:abrindo um programa na inicialização em um compositor Weston

O que eu tentei: criando um script de inicialização SysV com baixa prioridade

O que funciona: Weston é lançado, mas meu programa não

Olá, estou trabalhando em um programa em ambiente embarcado. O programa é baseado em Qt e gostaria que ele fosse executado quando o dispositivo fosse inicializado. Este dispositivo usa uma distribuição semelhante ao Debian, com a exceção de que quando inicializa, ele inicializa diretamente em um compositor Weston, em vez de em um login/desktop.

O que fiz até agora foi criar um /etc/init.dscript padrão (mostrado abaixo) que inicia meu programa usando start-stop-daemone possui uma alternância simples de início e parada. Isso funciona se for chamado manualmente, porém, usando update-rc.d appService defaultsresultados no programa que não inicia na inicialização.

Se eu tentar iniciar manualmente o serviço gera automaticamente ( systemctl start appService), recebo um erro XDG_RUNTIME_DIR. O que??? Por que X está no meu caminho?

Investigando o arquivo .service que o systemd gera automaticamente (também mostrado abaixo), o programa deseja executar antes que o multi-user.targetnível de execução seja atingido.

O roteiro

#!/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

O arquivo de serviço:

[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

Se eu tentar iniciar manualmente o serviço( systemctl start appService), recebo um erro XDG_RUNTIME_DIR. O que??? Por que X está no meu caminho?

Como posso corrigir esse script? Quero que ele seja lançado após o lançamento do compositor Weston

Responder1

O X11 requer que algumas variáveis ​​de ambiente sejam definidas para que os aplicativos sejam iniciados corretamente no X11. Você confirmou quais variáveis ​​de ambiente precisam ser definidas para iniciar aplicativos no Weston?

Na minha experiência, uma opção melhor para iniciar automaticamente aplicativos gráficos é usar um recurso de "aplicativos de inicialização" de ambientes de desktop do que systemd. Nesse design, as variáveis ​​de ambiente adequadas já estarão definidas para você.

informação relacionada