Наиболее вероятная причина возникновения ошибки - emulator
не знает, где находится ваш дисплей. Программы X11 используют переменную среды $DISPLAY
для определения местоположения сервера X11, и при запуске большинства демонов они не получают переменную окружения. (Большинству демонов не требуется [и не нужно] X11 для запуска.)
Вам нужно будет найти способ передать текущее значение $DISPLAY
демону - обратите внимание, что оно может меняться между входами в систему.
Что касается безопасности, никогда не используйте xhost +
- он дает полный доступ каждому 1. Вместо этого предоставьте другой учетной записи доступ к вашим данным Xauthority .
$ xauth extract /dev/stdout $DISPLAY | su -c "xauth merge /dev/stdin" jenkins
Один из возможных способов автоматизировать все это - поместить несколько команд в ваш ~/.xprofile
... вам потребуется поддержка ACL, чтобы сработало следующее:
# 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
и сделать сценарий emulator-wrapper
для запуска инструмента emulator
#!/bin/sh
# a wrapper script for 'emulator'
{ read -r DISPLAY; export DISPLAY; xauth nmerge /dev/stdin; } < /tmp/jenkins-display
exec emulator "$@"
Несколько некрасиво.
1 "Каждый" обычно означает любого пользователя, который может запускать программы на компьютере, но если ваш сервер X11 прослушивает TCP-соединения, это будет означать "весь Интернет", хотя в современных дистрибутивах это встречается редко.