2016-11-19 87 views
0

關於此主題有相當多的信息,但由於某些原因,我無法使其工作。這是一個覆蓋raspian發行版的'DietPi'風格的覆盆子pi,也許是我的問題和其他問題的區別。使用LXDE會話自動啓動GUI應用程序

所以我有一個GUI應用程序,我希望在LXDE會話開始後啓動時啓動。所以我在這裏使用的以下文件:

/etc/xdg/lxsession/LXDE/autostart 

,並添加一行:

@/myapplication 

這個工作,但是,它會啓動這個程序的多個實例,而第一個老是死機。這會產生問題,因爲資源(IO,文件等)有一些競爭。所以我所做的就是創建腳本文件,而不是/myapplication-autostart.sh像這樣:

if pgrep "myapplication" > /dev/null 
then 
    echo "my application is already running" 
else 
    /myapplication 
fi 

,然後改變的/ etc/XDG/lxsession/LXDE /自動啓動到@/myapplication-autostart.sh。現在我發現程序只啓動一次,但實例崩潰。它嘗試創建窗口時會崩潰(opencv imshow)。這很奇怪,因爲如果X會話不可用,程序也會無法運行,但由於某種原因,它會崩潰,我不知道該在哪裏檢查原因。

此外,爲了測試它不是腳本文件的問題,我評論了除/ myapplication以外的所有內容,並且我發現腳本文件在連續循環中運行,並且每次關閉應用程序時都會打開備份。我不確定這是爲什麼。

我已經嘗試在腳本中添加睡眠延遲,它並沒有幫助。無論出於何種原因,看起來LXDE自啓動腳本在啓動pi時至少運行了3次,而第一個環境的情況導致程序崩潰。有人明白調用這個自動啓動腳本的順序和行爲嗎?

回答

0

這裏是最後的解決方案......

的/ etc/XDG/lxsession/LXDE /自動啓動添加一行:

/myapplication-autostart.sh 

和/ MyApplication的-自動啓動。SH改爲:

#!/bin/bash 
if pgrep "myapplication" > /dev/null 
then 
    echo "my application is already running" 
else 
    if [[ "$DISPLAY" = ":0" ]] 
    then 
     /myapplication 
    fi 
fi 

我不得不寫的顯示變量組合的情況下對錯誤的文件來發現問題。在登錄時創建2個X會話,按照該順序顯示「:1」並顯示「:0」。顯示「:1」崩潰,因爲雖然不是無頭的,但它並未初始化爲特定的分辨率,並且我的程序中有一些調整大小的代碼。顯示「:0」是HDMI輸出和我想要的顯示。真的,有條件的檢查,看看應用程序是不是必要的,但我把它留在那裏是安全的。我也可以在LXDE自動啓動文件上留下@,但在我想關閉應用程序的情況下會感到煩惱,因爲它會不斷重新打開。可能我會稍後再回來。

感謝您的幫助!

+0

經過大量時間調查類似問題(浪費了幾乎幾個小時)之後,我想提供以下提示。新的位置是'/ etc/xdg/lxsession/LXDE-pi/autostart'(強調** - pi **),如下所示:https://www.raspberrypi.org/forums/viewtopic.php?f = 91&T = 131760 –

1

首先,關於打開該程序的幾個實例的一些註釋:當你在啓動文件的行開始處使用「@」(例如@/myapplication)時,這會要求系統嘗試啓動程序,但如果程序無法正確打開,系統會嘗試多次打開它,直到打開正確爲止 - 如果從行開頭刪除「@」,那麼系統將只嘗試打開一次程序。

現在,要找出爲什麼程序失敗,我勸你

2> /file/log 

添加到您的腳本中的每一個命令的末尾。這樣做會將任何錯誤消息附加到日誌(/ file/log),並且分析這些錯誤消息將是找出程序爲何行爲不當的關鍵。

一個重要的提示:,如果你的程序需要root權限才能運行,那麼它會通過時叫/失敗等/ XDG/lxsession/LXDE /自動啓動,因爲此方法調用,而提升權限的程序。

+0

我不知道@符號函數,謝謝澄清。我現在將用日誌文件測試它,看看第一個實例失敗的原因。謝謝! – DrTarr

+0

/file/log表示「XLib:extension」RANDR「在顯示時丟失:」1「。因此,LXDE自動啓動的第一次啓動沒有與其關聯的x會話或類似的問題。看到腳本被調用了兩次,但是我仍然遇到了第一次啓動崩潰的問題,我想我需要在腳本中寫一些東西來檢查X是否準備好了嗎? – DrTarr

+0

嘗試在乞討時對腳本進行很大的延遲,例如,從這開始:睡眠60,看看是否有效 –