Можно ли запустить программу OPENGL с помощью демона?

Мой главный вопрос: возможно ли запустить программу OPENGL с помощью демона (сценарий upstart)? Программа отображает окно на экране.

Подробнее: у меня есть программа opengl (сделанная с openframeworks, C ++), которую я хочу запустить с демоном.

Вручную я запускаю свою программу в терминале следующим образом:

planeviz@planeviz:~/src/of/apps/myApps/planeEtoiles/bin$ ./planeEtoiles

Теперь я создал скрипт upstart (/etc/init/myapp.conf), который должен запускать программу, когда компьютер загружается, и обязательно перезагрузите его в случае сбоев.

# job file
description "myapp"
author "eva"

# When to start the service
start on startup
start on runlevel [2345]

# When to stop the service
stop on runlevel [016]

# Automatically restart process if crashed
respawn

# Start the process
script
    sudo /home/planeviz/src/of/apps/myApps/planeEtoiles/bin/planeEtoiles
end script

Затем я пытаюсь запустить демон через

sudo service myapp start

Мое приложение не открывается. dmesg скажите мне:

planeviz@planeviz:/etc/init$ dmesg | grep "init:"
[ 5282.003496] init: myapp main process (8008) terminated with status 139

Состояние завершения 139, похоже, намекает на ошибку сегментации. Глядя на вывод моей программы в журнале выскочки, я вижу последнюю ошибку, связанную с созданием окна opengl.

planeviz@planeviz:/etc/init$ sudo tail /var/log/upstart/planeetoiles.log
....
[ error ] ofAppGLFWWindow: couldn't init GLFW

Это заставляет меня задаться вопросом, возможно ли вообще запускать программы OPENGL с помощью upstart, или это только для работы с фоновыми процессами?

1
задан 11 January 2014 в 01:32

1 ответ

Upstart предназначен для системных сервисов. Хотя вы можете (по крайней мере, в последних версиях) использовать его для мониторинга команды, которая выполняется во время сеанса пользователя, это неуклюже.

В Upstart, если вы хотите запустить службу, которая отображает окно с графическим интерфейсом, эта служба может запускаться только тогда, когда вы вошли в систему. Вместо того, чтобы запускаться и останавливаться на основе уровней запуска, вам нужно запускать и останавливать на основе входа в систему с графическим интерфейсом и выйти из событий.

start on desktop-session-start
stop on desktop-shutdown

Вам также нужна услуга, чтобы иметь возможность добраться до вашего дисплея. Приложения с графическим интерфейсом используют переменную среды DISPLAY для определения места отображения. В нормальных условиях ваш сеанс графического интерфейса будет отображаться как :0.

env DISPLAY=:0

Приложению также необходимо получить разрешение на доступ к дисплею. Это разрешение принимает форму файла cookie (пароля), который автоматически генерируется при запуске сеанса графического интерфейса пользователя и сохраняется в файле .Xauthority в вашем домашнем каталоге (или в другом файле, указанном переменной среды XAUTHORITY, в зависимости от ваш менеджер дисплеев). Если ваш менеджер дисплеев использует ~/.Xauthority, и вы запускаете службу от имени пользователя (что вы должны сделать в любом случае), вам не нужно устанавливать XAUTHORITY. Для получения дополнительной информации см. Можно ли запустить графическую программу на рабочем столе другого пользователя с правами root? и Открыть окно на удаленном дисплее X (почему «Не удается открыть дисплей»)?

setuid evsc

Вместо Upstart вы можете использовать инструмент контроля, который выполняет только контроль, а не управление системным обслуживанием. Убедитесь, что процесс всегда запущен. перечисляет несколько возможностей. Давайте использовать supervise из daemontools . Создайте каталог где-нибудь, например ~/.planeEtoiles. В этом каталоге создайте исполняемый файл с именем run, который является приложением, которое вы хотите продолжать выполнять:

mkdir ~/.planeEtoiles
ln -s /home/planeviz/src/of/apps/myApps/planeEtoiles/bin/planeEtoiles ~/.planeEtoiles/run

Добавьте команду supervise ~/.planeEtoiles в приложения , автоматически запускаемые при входе в систему . Чтобы остановить службу, используйте команду svc :

svc -t -x ~/.planeEtoiles

Последний фрагмент головоломки выполняет команду svc при выходе из системы. Эта функция, кажется, отсутствует, или, если нет, она очень плохо документирована. Если вы используете GDM, есть обходной путь, который должен выполняться из /etc/gdm/PostSession/Default , но этот файл запускает команду от имени пользователя root, что не является хорошим решением и не применяется к Lightdm. Мониторинг Выполнение сценария при выходе пользователя из системы (не пользователь root) и Как запустить сценарий во время выхода из системы GNOME, если у меня нет прав администратора? для решений.

0
ответ дан 11 January 2014 в 01:32

Другие вопросы по тегам:

Похожие вопросы: