MyTetra Share
Делитесь знаниями!
Запуск графических приложений в фоне через виртуальный фреймбуфер
Время создания: 09.11.2023 11:52
Автор: Stanislav German-Evtushenko
Текстовые метки: linux, X11, virtual, framebuffer, виртуальный, фреймбуфер, графика, GUI, приложение, программа, запуск
Раздел: Компьютер - Linux - Оконные менеджеры DE и X-сервер X11 в Linux
Запись: xintrea/mytetra_syncro/master/base/1699519962by1nlekkd4/text.html на raw.github.com

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


  • Вы хотите запустить 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="engineer"


# Разрешение экрана виртуального X-сервера

resolution="700x500x24"


# Программа, которая будет запускаться в фоне

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=engineer


# Внутри сервера с номером :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/_engineer/scripts/start_xvfb.sh &

...


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

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

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


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования