Como configurar o DISPLAY para executar um executável Java JAR Swing a partir de Init.d

1

Eu preciso executar um executável GUI do Java JAR Swing em uma distribuição Debian Raspbian Wheezy dentro de um dispositivo ARM durante o tempo de inicialização.

Estou seguindo isso como referência com myapp , myapp-start.sh e myapp-stop.sh e this com possíveis soluções (e outras mais semelhantes). Mas aqui não é referência à variável DISPLAY.

Eu verifiquei muitas alternativas, com

Tentadas e não aplicáveis Opções :

  • /usr/bin/java -jar -Djava.awt.headless=true $myapp.jar
  • unset DISPLAY (dentro de myapp-start.sh , acima da sentença java -jar )

Erros:

  • java.awt.HeadlessException: No X11 DISPLAY variable was set, but this program performed an operation which requires it.

Opções tentadas (dentro de myapp-start.sh , acima da sentença java -jar ):

  • export DISPLAY=:0
  • export DISPLAY=:0.0
  • export DISPLAY=localhost:0.0

Erros:

  • Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable ...
  • Client is not authorized to connect to ServerException in thread stack ...

Opções não experimentadas

  • ssh - X localhost : Como devo fazer um ssh para o servidor X11 ? Onde devo executar isso sob um processo init.d ?. Essa é a solução padrão para executar um programa Java com GUI?.
  • USER=root inside myapp-start.sh : O init.d pára e solicita a senha. Tão inteligente, o processo não começa.
  • Alguma das opções acima deve ser incluída em outro local além do código myapp-start.sh ? Onde?

Não deve ser mais simples para executar um único código na inicialização?.

Qualquer outra opção será apreciada.

EDIT 2015-04-12

Novas Opções

Nas opções a seguir, estou adicionando um código dentro desta localização /etc/xdg/lxsession/LXDE-pi/autostart para execução após o usuário padrão pi logs e X11 iniciarem (consulte jlliagre sugestão):

  • usr/bin/java -jar /home/pi/Embedded/bin/PowerBar.jar (sem e comercial)
  • %código% export DISPLAY=:0.0 (sem e comercial)
  • usr/bin/java -jar /home/pi/Embedded/bin/PowerBar.jar (sem e comercial)

Todos eles iniciam o aplicativo em segundo plano, ou seja, a música de fundo é reproduzida e os gráficos estão disponíveis somente por meio de um VNC em /bin/bash /home/pi/Embedded/bin/powerbarstart.sh (usando :0 ). Como efeito colateral, o protetor de tela é ativado e o aplicativo congela a cada 60 segundos aproximadamente. Por favor, note que este mesmo local também é usado para desativar o protetor de tela.

Existe uma opção ausente, ou símbolo, não estou incluindo?.

Solução O dispositivo foi configurado como TightVNC em vez de :1.0 . Alterar isso no :0.0 resolveu o problema.

    
por Brethlosze 12.04.2015 / 09:24

1 resposta

3

Se o seu aplicativo não for interativo, você poderá iniciar um servidor X11 virtual e definir a variável DISPLAY para o seu aplicativo para usá-lo.

Possíveis servidores X11 que podem ser usados dessa maneira são:

O último permite que você se conecte mais tarde para ver e interagir com a tela com um cliente VNC (vncviewer).

Se o seu Raspberry pi (ou similar) estiver configurado para login automático no usuário pi em um ambiente gráfico, você poderá iniciar seu aplicativo como o usuário pi e usar a exibição :0 . Tenha em atenção que tem de se certificar de que o X11 concluiu a sua inicialização antes de o fazer.

Edit: Parece que sua configuração está iniciando um servidor Xvnc primeiro, pois o usuário pi está iniciando o servidor X principal do buffer de quadros como o usuário root . Nesse caso, como você descobriu, seu aplicativo deve ser iniciado como root e usando :1 como exibição.

Como alternativa, se o que você realmente deseja é não iniciar o aplicativo uma vez no momento da inicialização, mas sempre que um usuário (normalmente pi ) efetua login em um ambiente gráfico, inclua-o no arquivo rc aplicável a esse ambiente gráfico. Por exemplo, /etc/xdg/lxsession/LXDE-pi/autostart .

    
por 12.04.2015 / 15:08