Как мне запустить 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 .

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