如何在 Linux 命令行模式下跑需要 X 环境的程序
在 Linux 上部署 Melt 和 Webvfx 时碰到了一个很棘手的问题—— Webvfx 依赖 X Server。
Cannot connect to display server
正如崔健唱到的:“听说过,没见过,X Server;有的说,没的做,怎知不容易”。没搞过这玩意儿啊,我跟另一个帮忙的同学都一头雾水,试来试去发现 ssh -X 可以转发到本地的 X Server 上处理,可问题是不能 ssh 一直连着啊,而且这么一来一回,速度慢的很呐。
于是结对 Google,看到有人说了这么一句话:
Yes, it's a GUI application. I heard that it can run on virtual frame buffer directly on linux without X-Windows system
查了查,试着用 xvfb-run
跑,还真能跑起来,简直是救命恩人。
然而问题来了,虽然能跑但产出的视频画质不对,有种显示器坏掉了花屏的感觉,猜测是色彩位数不对。
那么就应该是在初始化 X 环境时把色彩位数传进去,一番摸索找到 xvfb-run
有 --server-args
可以往 X Server 透传参数,所以正确的用法就是:
xvfb-run --server-args="-screen 0 1280x768x24" melt
至此,X 环境的问题解决了。
后面又碰到了一些诡异的问题,最终发现是我 webvfx 的源码下载错了。我从 release 里下载的时候没看时间,结果他们 release 的版本落后了 master 好几年,尼玛。拉了 master 的代码重新编译,啥问题都没了。而且还会我提示:
The MLT Qt module requires a X11 environment. Please either run melt from an X session or use a fake X server like xvfb: xvfb-run -a melt (...)
WTF!!! 搞错分支害死人啊!
怪我咯?