Как мне запустить Xvfb при запуске в Debian?


9

У меня есть веб-сервер Debian, который я использую для периодической очистки экрана через Selenum и Python.

Я использую Xvfb в качестве виртуального X-сервера для Firefox, чтобы работать под управлением Selenium. Учитывая, что я (думаю) я должен начать это использовать sudo, я не думаю, что будет возможно запускать его из Python каждый раз (см. Мой вопрос переполнения стека ), поэтому я подумал, что могу просто запустить его все время ,

В настоящее время я запускаю это так в командной строке:

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

Какой метод я должен использовать, чтобы сделать это автоматически при запуске? Должен ли я использовать cron, как предложено здесь ?

Ответы:


6

В debian вы можете добавить команду Xvfb в /etc/rc.local. Если Xvfb не отделяет себя в фоновом режиме, используйте &в конце команды.

Использование cron тоже подойдет, хотя сценарии инициализации дают вам больше контроля над тем, когда в последовательности запуска он будет выполняться, и являются традиционным способом запуска служб.


Ага, отлично. Является ли редактирование /etc/rc.localпредпочтительным по сравнению update-rc.dс использованием собственных сценариев?
Пол Д. Уэйт

2
@ Пол, я бы сказал update-rc.d, предпочтительнее и, безусловно, более способный, но rc.localбыстрее и проще. Кроме того, я думаю, что Жиль прав, нет причины, по которой это нужно для запуска с правами root.
Энди

4

Ваше предположение неверно: нет причин запускать Xvfb от имени пользователя root. Ваш обычный X-сервер должен работать только как root (на многих, но не на всех устройствах) только для того, чтобы иметь доступ к видеооборудованию; это не проблема для Xvfb по определению.

Если вы хотите запустить Xvfb при запуске, вы можете использовать cron, @rebootзаменив пять полей даты и времени. Вы можете сделать это в crontab любого пользователя, а не только в root. Но я не вижу смысла. Ваши сценарии были бы более надежными, если бы вы запускали Xvfb тогда, когда вам это нужно, именно так, как вы, кажется, изначально планировали это.


Действительная точка. Чтобы запустить Xvfb только для одной команды, вы можете использовать xvfb-runкоманду, которая обычно поставляется с Xvfb. Ниже приведена ссылка на xvfb-run manpages.debian.org/stretch/xvfb/xvfb-run.1.en.html . @Paul вы можете запустить его следующим образом:xvfb-run --server-args="-nolisten tcp -fbdir /var/run" python some-selenium.py
Sebisnow

4

Как предположил @Gilles , более удобно работать по требованию, особенно когда вы используете его для тестирования Selenium. Вот пример команд оболочки:

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

Проверка отображения с использованием xdpyinfobefore позволит убедиться, что вы не запустите виртуальный кадровый буфер дважды.


Если вам действительно нужно запустить его при запуске, вы можете попробовать следующий скрипт init.d :

#!/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

Также добавьте в environmentфайл для распознавания программами X, например:

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

Вот версия для версии systemd: dloman / xvfb.service .


Я знаю, что это год, но, похоже, не могу получить версию javascript selenium для работы с этим. Если я запускаю после загрузки, он работает, но когда я запускаю его как сервис, он как бы не обнаруживает xvfb. Любая идея, как я могу заставить обоих работать в качестве услуг на старте?
Масинде Мулиро

@MasindeMuliro Вы можете задать другой вопрос, чтобы ответы могли быть более актуальными, чтобы соответствовать вашей проблеме.
Кенорб
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.