среда, 16 февраля 2011 г.

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 &
...



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

8 комментариев: