Мой главный вопрос: возможно ли запустить программу 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, или это только для работы с фоновыми процессами?
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, если у меня нет прав администратора? для решений.