2016-11-19 41 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,看看是否有效 –