2015-07-13 9 views
0

Я хочу запустить приложение Qt на моей плате во время запуска. Он использует systemd для запуска процессов, а графический интерфейс - wayland. Поскольку он использует systemd, я написал простой сервис для запуска своего приложения. PSB.Запустить приложение Qt с помощью systemd

[Unit] 
Description=Qt App 
After=multi-user.target 


[Service] 
Type=simple 
WorkingDirectory=/home/root 
ExecStart=/etc/init.d/qtapp start 

[Install] 
WantedBy=multi-user.target 

Вот /etc/init.d/qtapp "сценарий просто источников 'профиль', устанавливает XDG_ * envs и начинает свой Qt приложение. Но с этой настройкой мое приложение не нравится. Но когда я проверил список запущенных процессов, он также отображает мое приложение. Итак, он работает, но я ничего не получаю на экране.

Если я запускаю приложение вручную после того, как плата поднята, она работает нормально. Я не уверен, почему он не запускается из systemd.

Неужели кто-нибудь столкнулся с этой проблемой? и любые предложения, которые я могу попытаться заставить его работать?

+0

Может быть проблема с разрешениями, не так попробуйте запустить qtapp из командной строки, используя того же пользователя, что и при запуске при запуске? – Marco

+0

Я использовал для входа в систему как root. Я могу запустить одно и то же приложение из командной строки без каких-либо проблем. После загрузки я проверил статус systemctl, и я вижу, что мое приложение работает, но ничего на экране. – vraj010

+0

Итак, вы уверены, что systemd запускает ваше приложение как root? – Marco

ответ

0

У меня была такая же проблема в моей работе. Мне нужно запустить приложение 7/24, и приложение должно автоматически перезагрузиться при сбое или вручную выйти из системы. Для этой цели я создал файл в /etc/init.d/xxx для запуска. Однако я не запускаю свое приложение здесь. Он просто запускает другой скрипт bash, который проверяет запущенные процессы и использует «grep», проверяет, работает ли мое приложение или нет. Если он не работает, он снова запускается. Почему я так использую;

  • добавить все библиотеки, Qt, OpenCV, и мои другие LIBS
  • Добавление команды будет проще, как и показ, который конфигурационный файл он должен использовать и какой уровень отладки он должен работать
  • Сохранение файлов журнала с выхода консоли, как (2> & 1 и т.д ..)

EDIT:

Таким образом, вы можете создать выскочка СБН ript, который запускает скрипт bash другого приложения. Например;

Upstart сценарий:

start on runlevel [2345] 
stop on runlevel [016] 

sleep 120 

script 
    exec /.1/MyApp/myApp.sh 
end script 

А вот myApp.sh:

#!/bin/bash 

    export QTDIR=/.1/MyApp/lib:/usr/local/Trolltech-4.8.2/ 
    export LD_LIBRARY_PATH=/.1/MyApp/lib:/usr/local/Trolltech-4.8.2/lib 

    while true;do 

    ps cax | grep myApp > /dev/null 
    if [ $? -eq 0 ]; then 
     echo "Application running " >> /.1/MyApp/bin/log/testUp.log 
     sleep 10 
    else 
     echo "Application started " >> /.1/MyApp/bin/log/testUp.log 
     cd /.1/MyApp/bin/ 
     /.1/MyApp/bin/myApp -c /.1/MyApp/conf/myApp.cfg -d 5 2>&1 > /.1/MyApp/bin/log/testUp.log 

    fi 

    done 
+0

Я не понял тебя. Могли ли вы запустить приложение Qt (или любой другой графический интерфейс) с помощью systemd? – vraj010

+0

@ vraj010 См. Мое редактирование – goGud

0

Это может быть потому, что из тупиковой ситуации здесь. Вы дали After=multi-user.target в разделе [Unit] файла службы, который запустит вашу службу после того, как multi-user.target встанет и в то же время вы хотите, чтобы это началось с multi-user.target в секции [Install] вашего служебный файл, предоставив опцию WantedBy=multi-user.target

Это создает зависимость от тупиковой ситуации. Чтобы избежать запуска этого сервиса с другой целью в разделе [Установка]. Или просто удалить «После =» вариант из секции [Unit] (если вы не хотите какую-либо зависимость)

Примечание: Не включить файл службы до перезагрузки системы с помощью systemctl enable your_service_file.service

 Смежные вопросы

  • Нет связанных вопросов^_^