Iniciando o aplicativo Qt na inicialização do Linux embarcado

4

Estou tentando fazer com que um aplicativo Qt seja iniciado imediatamente após a inicialização. Quando inicializada, a imagem do Linux não faz nada além de iniciar um servidor X e um terminal. Ele também tem o daemon do cron executando em segundo plano. Obviamente, meu aplicativo Qt precisa que o servidor X esteja rodando para fazer qualquer coisa.

Eu vi uma pergunta semelhante para o Red Hat e o SUSE Linux .

No entanto, não vejo isso funcionando para minha imagem.

Eu estou querendo saber se existe uma maneira padrão no Linux / UNIX para fazer um aplicativo GUI iniciar imediatamente após o X Server.

[sj755@localhost X11]$ tree /etc/X11/
/etc/X11/
|-- functions
|-- Xdefaults
|-- Xinit
|-- Xinit.d
|   |-- 01xrandr
|   |-- 11zaurus
|   |-- 12keymap
|   |-- 40xmodmap
|   |-- 50setdpi
|   |-- 55xScreenSaver
|   |-- 60xXDefaults
|   |-- 89xTs_Calibrate
|   '-- 98keymap-fixup
|-- xmodmap
|   |-- a716.xmodmap
|   |-- collie.xmodmap
|   |-- default.xmodmap
|   |-- h1910.xmodmap
|   |-- h2200.xmodmap
|   |-- h6300.xmodmap
|   |-- hx4700.xmodmap
|   |-- keyboardless.xmodmap
|   |-- omap5912osk.xmodmap
|   |-- poodle.xmodmap
|   |-- shepherd.xmodmap
|   |-- simpad.xmodmap
|   |-- slcXXXX.xmodmap
|   |-- xmodmap-invert
|   |-- xmodmap-left
|   |-- xmodmap-portrait
|   '-- xmodmap-right
|-- xorg.conf
|-- Xserver
|-- xserver-common
|-- Xsession
'-- Xsession.d
    |-- 60xXDefaults
    |-- 89xdgautostart
    '-- 90xXWindowManager

3 directories, 36 files
root@devboard:~# cat /etc/X11/Xsession.d/90xXWindowManager
if [ -x $HOME/.Xsession ]; then
    exec $HOME/.Xsession
elif [ -x /usr/bin/x-session-manager ]; then
    exec /usr/bin/x-session-manager
else
    exec /usr/bin/x-window-manager
fi
#!/bin/sh
#
# Very simple session manager for Mini X
#

# Uncomment below to enable parsing of debian menu entrys
# export MB_USE_DEB_MENUS=1 

if [ -e $HOME/.mini_x/session ]
then
exec $HOME/.mini_x/session
fi

if [ -e /etc/mini_x/session ]
then
exec /etc/mini_x/session
fi

MINI_X_SESSION_DIR=/etc/mini_x/session.d
if [ -d "$MINI_X_SESSION_DIR" ]; then
    # Execute session file on behalf of file owner
    find $MINI_X_SESSION_DIR -type f | while read SESSIONFILE; do
        set +e
        USERNAME='stat -c %U $SESSIONFILE'
        # Using su rather than sudo as latest 1.8.1 cause failure [YOCTO #1211]
#       su -l -c '$SESSIONFILE&' $USERNAME
        sudo -b -i -u $USERNAME $SESSIONFILE&
        set -e
    done
fi

# This resolution is big enough for hob2's max window size.
xrandr -s 1024x768

# Default files to run if $HOME/.mini_x/session or /etc/mini_x/session
# don't exist. 

matchbox-terminal&
exec matchbox-window-manager
    
por sj755 18.07.2013 / 17:43

3 respostas

3

Dê uma olhada em /etc/X11/xinit/xinitrc (isso pode ser lugares diferentes em sistemas diferentes) para ver quais arquivos ele origina. Geralmente, isso terá uma estrutura if..elif..else, para que apenas um arquivo de inicialização seja lido, com $HOME/.Xclients priorizado, em seguida, /etc/X11/xinit/Xclients . É quase certo que o terminal que aparece vem (presumo que você não tenha um ambiente de desktop instalado ou qualquer coisa).

De qualquer forma, se você quer apenas rodar um único aplicativo GUI, crie (ou modifique) um arquivo Xclients como este:

#!/bin/sh

myGUIapp

Isso deve ser executável. É praticamente um script de shell normal, creio eu, para que você possa ter mais coisas lá, embora, obviamente, não basear um aplicativo GUI bloqueie a execução nesse ponto.

[adição posterior]

Sua instalação não tem exatamente esses arquivos, mas tem um /etc/X11/Xinit.d e, se você observar, tenho certeza de que esses são scripts de shell curtos e eles são provenientes de algum lugar, provavelmente um dos arquivos em /etc/X11 - Xsession , Xserver ou xserver-common . Você pode querer verificar se $XINITRC está definido em seu ambiente; isso será uma pista.

Sua melhor aposta é provavelmente apenas criar um arquivo $HOME/.Xclients (ou como jofel menciona, $HOME/.xinitrc , que provavelmente é mais universal) e tentar - - exatamente a ortografia e o caso, com um ponto inicial, e deve ser definido chmod 755 (o grupo e outras permissões podem não importam). Quase certamente isso será proveniente de algum lugar corretamente.

Você pode colocar arquivos em /etc/X11/Xinit.d , mas fazê-lo para essa finalidade não é uma boa idéia, porque o seu deve ser executado por último e bloquear a execução adicional. Então, dê uma olhada nos scripts em /etc/X11 (novamente: Xsession , etc., eles não têm um sufixo .sh ) e tente descobrir em que ordem eles se encaixam. Também é provável que em algum lugar um deles verifique para um arquivo Xclients , por exemplo, por meio de algo como

if [ -x /some/path/Xclients ]; then

$HOME também pode ser usado e .xinitrc . É por isso que a criação de pelo menos uma dessas variações deve funcionar (gravar o arquivo e movê-lo / renomeá-lo se, a princípio, você não tiver êxito). Para resumir: candidatos principais para o nome: .xinitrx e .Xclients , em $HOME ou /etc/X11/ , mas se no último, eliminar o ponto principal.

    
por 18.07.2013 / 17:57
1

Você pode adicionar o comando ao $HOME/.xinitrc do usuário que inicia o servidor X.

Precisa ser um script shell $HOME/.xinitrc executável (primeira linha #!/bin/sh e chmod +x $HOME/.xinitrc ).

    
por 18.07.2013 / 17:59
1

Em primeiro lugar, não é necessariamente óbvio que "meu aplicativo Qt precisa que o servidor X esteja rodando para fazer qualquer coisa" - Eu executei com sucesso aplicativos Qt5 com o backend linuxfb de upstart . Se você puder fazer isso, obterá inicialização mais rápida e menor uso de memória do que usar o X. Por outro lado, talvez você queira que ele inicie os programas cliente X11 ou precise de um gerenciador de janelas, portanto, não é para todos.

Assumindo agora que seu aplicativo precisa de um servidor X, veja o gerenciador de exibição nodm . Isso é projetado para aplicativos incorporados; Eu uso para o meu frontend MythTV. É muito mais limpo do que intrometer-se com os scripts em /etc/X11/ e oferece a possibilidade de ter diferentes configurações para diferentes usuários, o que pode ser útil durante o desenvolvimento.

É muito fácil de usar; em uma instalação Debian, apenas edite /etc/default/nodm para ativar o nodm e especifique o nome de usuário requerido. Outros padrões provavelmente estão bem.

Em seguida, forneça a esse usuário um ~/.xinitrc adequado - no caso mais simples, você pode torná-lo um link simbólico para seu aplicativo. Mas é mais provável que seja um pequeno script /bin/sh que talvez defina um plano de fundo, instale um mapa de teclas, inicie um protetor de tela e quaisquer outras sutilezas que você desejar antes de exec myapplication .

Dica - substitua a última linha por exec xterm enquanto você está trabalhando nela - isso pode ser muito útil para testar as coisas.

    
por 04.05.2015 / 19:55