2015-07-13 90 views
0

我想在啓動期間在我的電路板上啓動'Qt'應用程序。它使用systemd來啓動進程,圖形後端是路徑。由於它使用systemd,我寫了一個簡單的服務來啓動我的應用程序。 PSB。使用systemd啓動Qt應用程序

[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的,和我的其他庫
  • 添加命令會更容易,如顯示其配置文件,它需要使用和調試級別它應該工作
  • 存儲日誌文件從控制檯輸出像(2> & 1等)

編輯:

所以,你可以創建新貴SC ript,這是開始你的其他應用程序的bash腳本。例如;

新貴腳本:

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

我沒有清楚地告訴你。你是否能夠使用systemd啓動Qt(或任何其他GUI)應用程序? – vraj010

+0

@ vraj010請參閱我的編輯 – goGud

0

這可能是因爲,死鎖情況在這裏。您已在服務文件的[Unit]部分中提供After=multi-user.target,該文件將在multi-user.target啓動後啓動您的服務,同時您希望在您的[Install]部分中以multi-user.target開頭通過提供選項的服務文件WantedBy=multi-user.target

這是創建死鎖類型的依賴關係。爲了避免這種情況,請在[安裝]部分以不同的目標啓動您的服務。或者只是刪除「後=」從[單位]部分選項(如果你不希望有任何的依賴性也)

注意:請重新啓動使用systemctl enable your_service_file.service