0,0
рейтинг
16 февраля 2011 в 19:38

Администрирование → Linux: запуск графических приложений в фоне

Приветсвую, коллеги!

— Вы хотите запустить linuxdcpp из консоли на домашнем компьютере находясь на работе?
— Вы хотите, чтобы он запускался сразу после загрузки системы, но не желаете использовать автологон?
— На вашем сервере есть программа, которая работает только в графическом режиме, но вы не хотите держать графическую сессию пользователя всё время включенной?

Если ответ хотя бы на один из вопросов «да», то эта статья для вас.



Думаю, что вы, так же как и я, нередко сталкивались с задачей запуска чего-либо в фоне таким образом, чтобы к этому чему-то потом можно было подключиться. Если с консольными программами тут проблем никаких нет, инструменты есть и они известны, например, тот же screen, то для графических приложений готовых инструментов нет (или же они малоизвестны).

На помощь нам приходит Xvfb (X virtual framebuffer) — виртуальный X-сервер, который для вывода использует не видеокарту, а оперативную память.

Работает всё достаточно просто и прозрачно, поэтому углубляться не буду (да, впрочем, и не во что углубляться), а просто опишу рабочие версии скриптов. Единственное, с чем пришлось повозиться в процессе их написания, так это с авторизацией X-сервера для возможности подлючения к сессии не обходя вопросы безопасности (т.е. не используя work around в виде «xhost +») — понимание, как всё должно работать пришло не сразу. Но обо всём по порядку.

Требования для работы скриптов


— Установленные пакеты: xvfb, x11vnc и либой vncviewer, например xtightvncviewer
— Ubuntu 10.04 (это не совсем требование, это то, на чём всё запускалось и тестировалось. После небольших правок это будет работать и на RHEL 5, но нужно иметь ввиду, что в пакете xvfb на RHEL5 нет сприпта-обёртки xvfb-run, но его можно найти в интернет или взять из deb-пакета в Ubuntu)

Скрипт запуска приложения


#!/bin/bash
# start_xvfb.sh

# Основные переменные
user="giner"    # пользователь из под которого будет запускаться приложение
resolution="700x500x24"    # разрешение экрана виртуального X-сервера
command=linuxdcpp    # программа, которая будет запускаться в фоне

# Запуск виртуального X-сервера и нашей программы внутри него, где
# xvfb-run - скрипт-обёртка для Xvfb
# /tmp/${user}.xvfb.auth - файл, в который запишется MAGIC-COOKIE для авторизации в X-сервере. К этому файлу имеет доступ на чтение только $user
# -screen 0 ${resolution} -auth /tmp/${user}.xvfb.auth - параметры передаваемые Xvfb при запуске
# Номер X-сервера по умолчанию :99, но его можно изменить используя ключ --server-num, если это необходимо

start_command="/usr/bin/xvfb-run -f /tmp/${user}.xvfb.auth -s '-screen 0 ${resolution} -auth /tmp/${user}.xvfb.auth' $command"

# Проверяем имя пользователя. Если оно не совпадает с $user, то запускаем с помощью "su".
# Это необходимо для правильного запуска из под пользователя root (например, при старте системы)

if ( [ "$(whoami)" = "$user" ] ) then
        bash -c "$start_command"
else
        su -c "$start_command" -l $user
fi


Скрипт для подключения к запущенному приложению


#!/bin/bash
# xvfb_connect.sh

user=giner

# Внутри сервера с номером :99 запускается VNC-сервер x11vnc, а затем к нему подключается vncviewer. При этом для авторизации используется файл MAGIC-COOKIE, который был автоматически создан при запуске виртуального сервера Xvfb

XAUTHORITY=/tmp/${user}.xvfb.auth DISPLAY=:99 x11vnc -listen localhost -bg && vncviewer localhost


Запуск при старте системы


Для запуска приложения при старте системы достаточно добавить скрипт start_xvfb.sh в /etc/rc.local, например:
...
/etc/_giner/scripts/start_xvfb.sh &
...


На этом всё. Приятного администрирования!

Update1: в комментариях рассказали (ykl) про xpra, который является частю проекта partiwm. В сущности — это готовое решение для выполнения тех же задач, что и мои скрипты написанное на python и не требующее VNC.

Update2: как справедливо заметил paramobilus, подобным образом запускать приложения на сервере можно и в случае отсутствия рабочего окружения, оконного-менеджера, X-ов и даже видеокарты.
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Администрирование

Комментарии (28)

  • +6
    Не стоит только забывать, что если есть необходимость просто запустить графическое приложение на домашнем компьютере, а управлять им нужно локально, или другими словами транслировать интерфейс на локальный компьютер с удаленного, то можно просто воспользоваться ssh -X и радоваться.
    • +6
      Верно, но если запустить по ssh -X, то:
      — как только вы закроете консольную сессию приложение тут же завешит работу
      — чтобы сделать это из Windows нужно будет использовать ещё и X-сервер (например Xming)
      — ssh -X обычно очень медленно рабоатет через интернет, лучше ssh -XC, а ещё лучше NX
      • +1
        NX rocks! :)
        • 0
          NX вроде бы закрыли или закопали, нет?
          • 0
            Официальная 4-я версия будет закрытой, но есть форки 3-й.
  • +4
    Есть очень интересное приложение xpra, которое тоже использует Xvfb.
    Но не требует vnc, можно присоединиться к сессии и он вернет текущие состояния приложений в виде отдельных окон. Также можно аттачить сессию по ssh.
    В некотором роде xpra — screen для X-ов.
    • 0
      Огромное спасибо, долго же я искал что-то подобное, пока на наткнулся на Xvfb. Пойду поизучаю, посмотрю что оно умеет.
    • 0
      В очередной раз убеждаюсь том, что информацией нужно делиться. Я давно хотел написать этот пост, но всё время откладывал, а написав теперь вот узнал про xpra.
      Посмотрел эту программу и вообще проект partiwm — супер! Ещё раз спасибо.
    • 0
      Написал небольшой топик о Xpra, а правила создания топиков оказывается поменялись со времени моей последней публикации. Придется немного подождать :)
      • 0
        Правила?
        • 0
          Точнее правила опубликования, раньше не было ограничения в +5 кармы. Можно было писать в персональный блог, даже если меньше 5 и потом, если достойный топик перенести в тематический. Это с недавних пор оказывается поменяли.
  • 0
    Хм, надо будет попробовать, а то мы все как-то через NX в основном.
    • 0
      Это не заменит NX, если вы говорите об использовании машины как терминал сервера :)
  • +2
    Хочу дополнить, что приложение Xvfb вполне самодостаточно и не требует для своей работы установки полноценного гуёвого окружения. Фактически для его работы необходим десяток приложений (x11-common, xserver-common, и несколько библиотек) — всего около 10-15 Мб. Таким образом его можно использовать практически в голой консоли, если есть необходимость запустить графику. Аналогичным способом запускал на сервере skype и virtualbox.
    • +2
      Да, кстати, тоже важный момент!
    • +3
      Простите, а зачем запускать VirtualBox с гуями, если он сам вполне может запускаться чисто консольно?
    • +1
      Виртуалбокс можно запустить в Headless режиме, если что
      • 0
        Так и думал, что меня неправильно поймут. Headless используется для уже установленного образа. А сам процесс установки и настройки образа в виртуальной машине можно делать через Xvfb.
        • 0
          Дык. В Headless нативно по RDP можно к консоли прицепиться.
          • 0
            3 комментария и все про одно и то же. :) Еще раз говорю. Headless для меня не новость, пользуюсь им ежедневно для работы с установленным образом. Объяснять мне принципы его работы излишне. Да, я знаю, что можно было создать образ в голой консоли без Xvfb. Только для этого пришлось бы набрать с десяток команд строго определённого синтаксиса. Кто их помнит наизусть? Xvfb в этом плане облегчает процедуру установки, предоставляя возможность воспользоваться привычной графической оболочкой Vbox'а.
  • +1
    Всё-таки предпочитаю Xvnc — если что, к нему легко подцепиться снаружи и получить полноценную гуйню
    • 0
      На RHEL5 нет возможности переключать пользователей без логофа, а нам, по требованиям безопасности, нельзя использовать общий логин. Ну и плюс к этому новый вариант позволил не использовать автологон на случай, если сервер необходимо перезагрузить.
      • 0
        Не вижу связи. Что мешает запустить несколько Xvnc от разных юзеров и чем он с точки зрения безопасности существенно отличается от Xfvb?
        • 0
          В случае с реальным X сервером пришлось бы решать следующие задачи:
          — что делать с автологоном после перезагрузки сервера (тот, кто перезагружает сервер не должен иметь доступ к запущенному ПО)
          — как заблокировать сессию (чтобы на неё нельзя было просто по alt+ctrl+Fx переключиться)
          — что делать если такого ПО нужно запустить не одно, а несколько и под разными пользователями
          В процессе могут возникнут и другие сложности, которые я сейчас не могу предугадать.
  • +2
    А использует ли Xvfb возможности аппаратного ускорения (например, с драйвером fglrx)? Могло бы сильно помочь для рендеринга трехмерных графиков и подобных задач…
    • +3
      А это интересный вопрос, нужно посмотреть.
      PS: Простите, случайно поставил минус к вашему комменту, хотел плюс нажать.
    • +6
      Не использует. Виртуальный он. От железа не зависит.
    • 0
      GLX он использует по умолчанию, поэтому 3D в принципе работает (если не установлен проприетарный драйвер), но можно ли заставить его работать с железом пока не разобрался.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.