2012-11-20 47 views
2

我有一個使用systemd啓動進程的嵌入式Linux主板。我還有一個用Qt編寫的GUI,我可以從命令行啓動,並使用主板的觸摸屏或按鈕進行交互。要啓動應用程序,我通常做:使用systemd自動啓動的Qt GUI實例不會響應輸入

ssh [email protected] 
cd ~/ 
./gui 

我想這使用SystemD自動啓動,所以我寫的,看起來像這樣一個服務文件:

[Unit] 
Description=The Qt Gui 
After=dropbear.service systemd-logind.service 
ConditionFileIsExecutable=/home/user/gui 

[Service] 
ExecStart=/home/user/gui 
Restart=on-abort 

[Install] 
WantedBy=multi-user.target 

當董事會靴子我見該systemd日誌,它是dropbear SSH服務後馬上開始我的GUI:

[ OK ] Started Dropbear SSH2 daemon. 
     Starting The Qt Gui... 
[ OK ] Started The Qt Gui. 

如果我引導並運行「PS」後SSH連接到電路板,我可以看到我的進程啓動(如果我殺了它它按照預期重新開始特德從systemd):

196 root  26868 S /home/user/gui 

的systemctl狀態輸出看起來OK我,看到最後一行 'ARM生成' 是我的代碼qDebug()print語句:

gui.service - The Qt Gui 
     Loaded: loaded (/etc/systemd/system/gui.service; enabled) 
     Active: active (running) since Tue, 2012-11-20 21:30:20 UTC; 4min 35s ago 
    Main PID: 196 (gui) 
     CGroup: name=systemd:/system/gui.service 
      └ 196 /home/user/gui 

Nov 20 21:30:20 systemd[1]: Starting The Qt Gui... 
Nov 20 21:30:20 systemd[1]: Started The Qt Gui. 
Nov 20 21:30:22 gui[196]: ARM build 

不過我根本無法與使用systemd啓動的GUI實例進行交互!如果我從命令行啓動輔助實例的次數少於按下按鈕或觸摸屏,並且GUI在屏幕上彈出並按預期工作。是什麼賦予了?我已經在服務文件中嘗試了'Type = forking',這也沒有幫助。關於這裏有什麼問題的任何想法?我怎樣才能讓systemd啓動我的Qt GUI,就像我從命令行執行一樣?謝謝 -

+0

也許這可能涉及到不同的工作目錄。您應該檢查是否使用與systemd相同的工作目錄,您的應用程序仍然具有良好的行爲,可以通過命令行啓動。 –

+0

問題可能是因爲您在登錄時啓動它,但尚未正確設置所有內容。我曾經遇到過一個問題,Qt在登錄時自動啓動時沒有在KDE中創建一個托盤圖標,因爲它在系統托盤可用之前啓動。你能安排程序在登錄後10-20秒開始嗎? – sashoalm

回答

1

感謝上面的輸入。它實際上不是一個工作目錄或時間問題。問題是我的Qt GUI沒有獲得它與觸摸屏進行通信所需的適當環境變量。採購/ etc/profile文件爲我工作:

[Unit] 
Description=The Qt Gui 
After=dropbear.service 
ConditionFileIsExecutable=/home/user/gui 

[Service] 
Type=simple 
TimeoutStartSec=60 
WorkingDirectory=/home/user 
ExecStartPre=/bin/sh -c 'echo 127 > /sys/class/backlight/generic-bl/brightness' 
ExecStart=/bin/sh -c 'source /etc/profile ; /home/user/gui -qws' 
Restart=always 

[Install] 
WantedBy=multi-user.target