当我在命令行上这样做时,它工作得很好
xhost +
su - jenkins
emulator -avd myAVD.avd
但
emulator -avd myAVD.avd
jenkins 守护进程执行失败
"SDL init failure: No available video device"
我怎样才能放宽 jenkins 守护进程的 X 安全约束,
以便它可以emulator -avd myAVD.avd
不失败地运行?
答案1
你得到错误最可能的原因是emulator
不知道在哪里您的显示是。X11 程序使用$DISPLAY
环境变量来发现 X11 服务器位置,并且大多数守护进程启动时不会接收环境变量。(大多数守护进程不需要 [也不应该] 运行 X11。)
你需要找到一种方法将当前的值传递$DISPLAY
给守护进程——注意它可能登录之间进行更改。
至于安全,不要曾经使用过xhost +
– 它提供完全访问权限每个人1.而是让其他账户访问您的权威机构数据。
$ xauth extract /dev/stdout $DISPLAY | su -c "xauth merge /dev/stdin" jenkins
实现所有这些自动化的一种可能方法是将一些命令放入您的~/.xprofile
...您将需要启用 ACL 支持才能进行以下操作:
# 你的 .xprofile 如果 [ “$DISPLAY” ]; 那么 触摸/tmp/jenkins-display setfacl -mu::rw,u:jenkins:r,g::-,o::- /tmp/jenkins-display { echo $DISPLAY; xauth nextract /dev/stdout $DISPLAY; } > /tmp/jenkins-display 菲
并编写一个emulator-wrapper
运行该emulator
工具的脚本:
/bin/sh #!/bin/sh 复制代码 #“模拟器”的包装脚本 { 读取 -r DISPLAY;导出 DISPLAY;xauth nmerge /dev/stdin;}} 执行模拟器“$@”
有点丑。
1 “每个人”通常指可以在计算机上运行程序的任何用户 - 但如果您的 X11 服务器正在监听 TCP 连接,则意味着“整个互联网”,尽管这在现代发行版中并不常见。