É possível executar um programa OPENGL através de um daemon?

1

A minha principal questão é: É possível executar um programa OPENGL através de um daemon (script upstart)? O programa exibe uma janela na tela.

Mais detalhes: Eu tenho um programa opengl (feito com openframeworks, C ++) que eu quero rodar com um daemon.

Manualmente eu inicio meu programa no terminal assim:

planeviz@planeviz:~/src/of/apps/myApps/planeEtoiles/bin$ ./planeEtoiles

Agora eu criei um script upstart (/etc/init/myapp.conf), que deve iniciar o programa quando o computador for inicializado, e certifique-se de reiniciá-lo em caso de falhas.

# job file
description "myapp"
author "eva"

# When to start the service
start on startup
start on runlevel [2345]

# When to stop the service
stop on runlevel [016]

# Automatically restart process if crashed
respawn

# Start the process
script
    sudo /home/planeviz/src/of/apps/myApps/planeEtoiles/bin/planeEtoiles
end script

Então eu tento iniciar o daemon via

sudo service myapp start

Meu aplicativo não abre. dmesg me diga:

planeviz@planeviz:/etc/init$ dmesg | grep "init:"
[ 5282.003496] init: myapp main process (8008) terminated with status 139

O status de terminação 139 parece sugerir uma falha de segmentação. Olhando para a saída do meu programa no log upstart, vejo o último erro relacionado à criação da janela opengl.

planeviz@planeviz:/etc/init$ sudo tail /var/log/upstart/planeetoiles.log
....
[ error ] ofAppGLFWWindow: couldn't init GLFW

Isso me faz pensar se é possível rodar programas OPENGL com upstart, ou se é apenas para trabalhar com processos em segundo plano?

    
por evsc 10.01.2014 / 21:58

1 resposta

1

O Upstart foi projetado para serviços do sistema. Embora você possa (pelo menos com versões recentes) usá-lo para monitorar um comando executado durante uma sessão de usuário, ele é desajeitado.

Com o Upstart, se você quiser executar um serviço que exibe uma janela GUI, esse serviço só pode ser executado enquanto você estiver conectado. Em vez de iniciar e parar com base em níveis de execução, você precisa iniciar e parar com base no login da GUI e eventos de logout.

start on desktop-session-start
stop on desktop-shutdown

Você também precisa que o serviço alcance seu monitor. Aplicativos GUI usam a variável de ambiente DISPLAY para determinar onde exibir. Em circunstâncias normais, sua sessão da GUI será a exibição chamada :0 .

env DISPLAY=:0

O aplicativo também precisa obter permissão para acessar a exibição. Essa permissão assume a forma de um "cookie" (uma senha) que é gerada automaticamente quando a sessão da GUI é iniciada e armazenada no arquivo .Xauthority em seu diretório pessoal (ou outro arquivo indicado pela variável de ambiente XAUTHORITY , dependendo seu gerenciador de exibição). Se o seu gerenciador de exibição usar ~/.Xauthority e você executar o serviço como seu usuário (o que você deve fazer de qualquer maneira), não será necessário definir XAUTHORITY . Para obter mais detalhes, consulte Posso lançar um programa gráfico na área de trabalho de outro usuário como root? e Abra uma janela em um display X remoto (por que" Não é possível abrir a tela ")?

setuid evsc

Em vez do Upstart, você pode usar uma ferramenta de supervisão que apenas faz a supervisão e não o gerenciamento do serviço do sistema. Assegure-se de que um processo esteja sempre em execução lista várias possibilidades. Vamos usar supervise de daemontools . Crie um diretório em algum lugar, por exemplo %código%. Nesse diretório, crie um executável chamado ~/.planeEtoiles , que é o aplicativo que você deseja continuar executando:

mkdir ~/.planeEtoiles
ln -s /home/planeviz/src/of/apps/myApps/planeEtoiles/bin/planeEtoiles ~/.planeEtoiles/run

Adicione o comando run aos aplicativos automaticamente iniciados no login . Para interromper o serviço, use o comando supervise ~/.planeEtoiles :

svc -t -x ~/.planeEtoiles

A última peça do quebra-cabeça está executando o comando svc no logout. Esse recurso parece estar faltando ou, se não, está muito mal documentado. Se você estiver usando o GDM, há uma solução alternativa que deve ser executada em svc , mas esse arquivo executa o comando como root, o que não é uma boa solução e não se aplica ao Lightdm. Monitor Execução de script no logout do usuário (usuário não root) e Como posso executar um script durante o logout do GNOME se eu não tiver privilégios de administrador? para soluções.

    
por Gilles 11.01.2014 / 02:26