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.d
script padrão (mostrado abaixo) que inicia meu programa usando start-stop-daemon
e possui uma alternância simples de início e parada. Isso funciona se for chamado manualmente, porém, usando update-rc.d appService defaults
resultados 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.target
ní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ê.