|
|||||||
Запуск графических приложений в фоне через виртуальный фреймбуфер
Время создания: 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
|
|||||||
|
|||||||
Если ответ хотя бы на один из вопросов «да», то эта статья для вас. Думаю, что вы, так же как и я, нередко сталкивались с задачей запуска чего-либо в фоне таким образом, чтобы к этому чему-то потом можно было подключиться. Если с консольными программами тут проблем никаких нет, инструменты есть и они известны, например, тот же 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-ов и даже видеокарты. |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|