O motivo mais provável de você receber o erro é que emulator
não sabe onde está sua exibição. Os programas X11 usam a variável de ambiente $DISPLAY
para descobrir o local do servidor X11 e, como a maioria dos daemons são iniciados, eles não recebem a variável environ. (A maioria dos daemons não precisa [e não deveria] executar o X11.)
Você precisará encontrar uma maneira de passar o valor atual de $DISPLAY
para o daemon - note que pode mudar entre logins.
Quanto à segurança, não nunca usa xhost +
- dá acesso total a todos 1 . Em vez disso, conceda à outra conta acesso aos seus dados do Xauthority .
$ xauth extract /dev/stdout $DISPLAY | su -c "xauth merge /dev/stdin" jenkins
Uma maneira possível de automatizar tudo isso é colocar alguns comandos em ~/.xprofile
... você precisará do suporte à ACL ativado para o seguinte:
# your .xprofile if [ "$DISPLAY" ]; then touch /tmp/jenkins-display setfacl -m u::rw,u:jenkins:r,g::-,o::- /tmp/jenkins-display { echo $DISPLAY; xauth nextract /dev/stdout $DISPLAY; } > /tmp/jenkins-display fi
e crie um script emulator-wrapper
para executar a ferramenta emulator
:
#!/bin/sh # a wrapper script for 'emulator' { read -r DISPLAY; export DISPLAY; xauth nmerge /dev/stdin; } < /tmp/jenkins-display exec emulator "$@"
Um pouco feio.
1 "Todos" geralmente significa qualquer usuário que possa rodar programas no computador - mas se o seu servidor X11 estiver procurando por conexões TCP, isso significaria "toda a Internet", embora isso seja incomum nas distros modernas.