如何在 Debian 上启动 Xvfb?

如何在 Debian 上启动 Xvfb?

我有一个 Debian Web 服务器,偶尔通过 Selenum 和 Python 进行屏幕抓取。

我使用 Xvfb 作为 Firefox 在 Selenium 控制下运行的虚拟 X 服务器。鉴于我(认为)我必须使用 来启动它sudo,我认为每次都从 Python 启动它是不可行的(参见我的堆栈溢出问题),所以我想我可以让它一直运行。

我目前在命令行中这样启动它:

sudo Xvfb :99 -nolisten tcp -fbdir /var/run

我应该使用什么方法在启动时自动执行此操作?我应该cron按照建议使用这里

答案1

在 debian 上,您可以将 Xvfb 命令添加到/etc/rc.local.如果 Xvfb 没有将自身分离到后台,请&在命令末尾使用 。

使用 cron 也可以工作,尽管 init 脚本可以让您更好地控制启动序列中它将运行的确切时间,并且是启动服务的传统方式。

答案2

作为@吉尔斯建议,它更适合按需运行,特别是当您使用它进行 Selenium 测试时。下面是 shell 命令示例:

export DISPLAY=:99
xdpyinfo -display $DISPLAY > /dev/null || Xvfb $DISPLAY -screen 0 1024x768x16 &

使用之前检查显示xdpyinfo将确保您不会运行虚拟帧缓冲区两次。


如果确实需要开机启动,可以尝试以下方法初始化文件脚本:

#!/bin/sh
XVFB=/usr/bin/Xvfb
XVFBARGS=":1 -screen 0 1024x768x24 -ac +extension GLX +render -noreset -nolisten tcp"
PIDFILE=/var/run/xvfb.pid
case "$1" in
  start)
    echo -n "Starting virtual X frame buffer: Xvfb"
    start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --background --exec $XVFB -- $XVFBARGS
    echo "."
    ;;
  stop)
    echo -n "Stopping virtual X frame buffer: Xvfb"
    start-stop-daemon --stop --quiet --pidfile $PIDFILE
    echo "."
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  *)
        echo "Usage: /etc/init.d/xvfb {start|stop|restart}"
        exit 1
esac

exit 0

来源:dloman/xvfb 在 GitHub 上(分叉自:jterrace/xvfb

将其另存为/etc/init.d/xvfb并使其可执行,然后将其启动为:

/etc/init.d/xvfb start

要在启动时自动运行,请运行:

sudo update-rc.d xvfb defaults

要将其从自动运行中删除,请运行:

sudo update-rc.d -f xvfb remove

还要添加到environmentX 程序可以识别的文件中,例如:

echo DISPLAY=":1" | sudo tee -a /etc/environment

这是 systemd 版本:dloman/xvfb.service

答案3

您的前提无效:没有理由以 root 身份运行 Xvfb。你常用的 X 服务器只需要以 root 身份运行(在许多但不是所有的 unice 上),这样它就可以访问视频硬件;根据定义,这对于 Xvfb 来说不是问题。

如果您想在启动时运行 Xvfb,可以使用 cron@reboot替换五个日期和时间字段。您可以在任何用户的 crontab 中执行此操作,而不仅仅是 root 的 crontab。但我不明白这一点。如果您在需要时启动 Xvfb,您的脚本将会更加健壮,就像您最初计划的那样。

相关内容