Запустите приложение GTK # из службы Linux - PullRequest
0 голосов
/ 21 ноября 2011

Окружающая среда
RHEL 5.7, 64-битный
уровень запуска 5
моно 2.6.7

У меня есть консольное приложение C #, которое запускается как служба при запуске. Из кода этого приложения он запускает два процесса, которые также являются приложениями на C #. Один - это другое консольное приложение, а другой - приложение GTK (но он не отображает свое окно графического интерфейса).

Запуск этого основного приложения в обычном режиме (mono app.exe) работает нормально. Однако при запуске его в качестве службы приложение GTK аварийно завершает работу в Application.Init () с сообщением об ошибке «Дисплей GTK-не открывается».

Это сообщение об ошибке также появляется, когда мы пытаемся непосредственно запустить приложение GTK (он же «mono appname.exe») на уровне выполнения 3 (при условии, что Application.Init () что-то делает с оконным менеджером, которого нет) , Так запускается ли служба linux каким-либо образом на уровне выполнения 3, даже если мы запускаем компьютер на уровне выполнения 5? И если да, то есть ли способ заставить его работать на уровне запуска 5?

Спасибо.

РЕДАКТИРОВАТЬ - дополнительная информация: Приложение GTK настроено так, что оно может работать с или без запуска своего графического интерфейса через параметр командной строки. Однако мы используем Gtk.Application.Run () для запуска приложения из основного независимо от того, как оно работает. Gtk.Application.Init () должен быть вызван до Gtk.Application.Run (), и он пытается что-то сделать с сервером x - что, очевидно, вызывает проблему на уровне выполнения 3. Однако наша машина всегда будет запускаться на уровне выполнения 5 .

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

1 Ответ

0 голосов
/ 22 ноября 2011

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

При запуске в качестве службы во время загрузки ваша программа будет работать от имени пользователя root или другого назначенного пользователя. У него не будет ассоциированного X-сеанса (возможно, X не запустился).

Когда запускается основной цикл GTK (через Application.Init), он пытается связаться с X-сервером, который он не может найти, или, если он не имеет разрешения на использование.

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

Кроме того, предположительно, в вашем сервисе есть какая-то клиентская программа? Почему ваш графический интерфейс не может быть клиентом и запущен отдельно?

...