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

0

The Want: abrindo um programa na inicialização em um compositor de Weston

O que eu tentei : criar um script de init do SysV com baixa prioridade

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

Olá, estou trabalhando em um programa em um ambiente incorporado. O programa é baseado em Qt, e gostaria que fosse executado quando o dispositivo for inicializado. Este dispositivo usa uma distro do tipo Debian, com a exceção de que, quando é inicializado, ele é inicializado diretamente para um compositor Weston, em vez de um login / desktop.

O que eu fiz até agora foi criado um script padrão /etc/init.d (mostrado abaixo) que inicia meu programa usando start-stop-daemon e tem um simples alternar start-stop. Isso funciona se chamado manualmente, no entanto, usando update-rc.d appService defaults resulta no programa não iniciar 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 o X está atrapalhando?

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

O script

#!/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 ), receberei um erro XDG_RUNTIME_DIR. O que??? Por que o X está atrapalhando?

Como posso corrigir esse script? Eu quero que seja lançado após o lançamento do compositor de Weston

    
por T. Wallis 07.03.2018 / 19:15

1 resposta

1

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

Na minha experiência, a melhor opção para aplicativos gráficos de inicialização automática é usar um recurso de "aplicativos de inicialização" em ambientes de área de trabalho do que systemd . Nesse design, as variáveis de ambiente adequadas já estarão definidas para você.

    
por 07.03.2018 / 19:25