关于这个主题有很多信息,但由于某些原因我无法让它工作。这是在覆盆子pi上运行'DietPi'风味的覆盆子发行版,也许是我的问题与其他问题的区别。
所以我有一个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 / autostart更改为@ / myapplication-autostart.sh。现在我发现程序启动一次,但实例崩溃了。它在尝试创建窗口时崩溃(opencv imshow)。这很奇怪,因为如果X会话不可用,程序也会无头,但由于某种原因它会崩溃,我不知道在哪里检查原因。
另外,为了测试它不是脚本文件的问题,我评论了除了/ myapplication以外的所有内容,我发现脚本文件在一个连续循环中运行,每次关闭应用程序时它都会打开备份。我不确定为什么会这样。
我已尝试在脚本中添加睡眠延迟,但没有帮助。无论出于何种原因,似乎LXDE自动启动脚本在启动pi时至少运行了3次,并且第一次启动时导致程序崩溃。有人理解调用此自动启动脚本的顺序和行为吗?
答案 0 :(得分:1)
首先,关于打开程序的几个实例的一些注释:当你在启动文件的行开头使用“@”时(例如@ / myapplication),这会请求你的系统尝试启动程序,但如果程序无法正确打开,那么系统将尝试多次打开它,直到它正确打开 - 如果从行开头删除“@”,那么系统将只尝试打开程序一次。
现在,为了找出程序失败的原因,我建议你添加
2> /file/log
到脚本上每个命令的末尾。这样做会将任何错误消息附加到日志(/ file / log),并且分析这些错误消息将是找出程序行为不正常的关键。
一个重要的注意事项:如果您的程序需要root权限才能运行,那么当通过/ etc / xdg / lxsession / LXDE / autostart调用时它将失败,因为此方法调用没有提升权限的程序。
答案 1 :(得分:0)
这是最终解决方案......
/ etc / xdg / lxsession / LXDE / autostart添加了一行:
/myapplication-autostart.sh
和/myapplication-autostart.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自动启动文件上留下@但在我想要关闭应用程序的情况下它很烦人,因为它会继续重新打开。可能我会稍后再说。
感谢您的帮助!
答案 2 :(得分:0)
也可以使用 XDG 标准自动启动 - 它独立于所使用的桌面环境 - 通过将桌面文件放置在
$XDG_CONFIG_HOME/autostart
(默认为 ~/.config/autostart
)$XDG_CONFIG_DIRS/autostart
处(默认为 /etc/xdg/autostart
)进行系统范围的自动启动。这样的 .desktop
文件可能如下所示:
[Desktop Entry]
Type=Application
Version=1.0
Name=JDownloader
Exec=/usr/local/bin/my-application.sh
Categories=Utilities
可以在 freedesktop.org 找到桌面文件的规范。