Pull to refresh

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

Reading time 3 min
Views 59K
Приветсвую, коллеги!

— Вы хотите запустить 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-ов и даже видеокарты.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+79
Comments 28
Comments Comments 28

Articles