树莓派开机自启动opencv程序脚本及报错分析及拓展

文章介绍了如何在Ubuntu系统中使用.desktop文件实现程序开机自启动,包括文件模板和配置详细步骤。同时,提到了使用脚本自启动的方法,特别是对于包含opencv等窗口化程序时可能遇到的问题和解决方案。最终,作者建议使用双击桌面图标的方式启动程序,以避免开机启动时的图形化问题。
摘要由CSDN通过智能技术生成

解决放开头:三连不发愁!!!

Ubuntu 桌面程序开机自启
开机自启
只是方法之一,使用 .desktop 文件。

.desktop

Desktop Entry 文件是 Linux 桌面系统中用于描述程序启动配置信息的文件,它以 .desktop
为后缀名,相当于Windows系统下的桌面快捷方式。通常一个二进制可执行程序是一个没有后缀没有图标的文件,不可以随意移动。

desktop 文件的基本模板

以 operation.desktop 为例

[Desktop Entry]
Name=<应用程序名>
Type=Application
Exec=<应用程序完整路径>
Icon=<应用程序图标的完整路径>
Terminal=<指定是否在终端内运行>
StartupNotify=<>
Categories=<程序类别>
Encoding=<编码>
  • Name: desktop 文件最终显示的名称(一定要注意和 desktop 文件名的区别)
  • Type: 用于指定 desktop, 文件的类型(包括 3 种类型:Application、Link、Directory):使用 Application代表这是一个应用程序!!!
  • Exec: 用于指定二进制可执行程序的完整路径
  • Icon: 指定应用程序图标的完整路径(可以省略后缀名)。图标支持 png 格式、svg 格式等,图标的推荐尺寸为 128x128。
  • Categories:主要用于菜单展示归类

开机启动操作!!!

开机启动 先提供权限,是启动器可以被打开!!!
chmod 765 operation.desktop 将operation.desktop 文件移动到 ~/.config/autostart/ 目录下。开机启动登录到用户后,应用会自动启动。
如需取消,也就是不需要,删掉该文件就行!!!

以下是实际图:
在这里插入图片描述
将可执行文件放入用户开机自启动目录,该目录是用户登录后才执行的,并且给文件赋予相关权限后,可开机自启动!!!
亲测🆗!!!

下面这部分是最开始尝试的另一个方法,通过设置脚本不关用户问题的直接开机自启动!(也就是开机引导阿,初始化程序阿啥的那些开机设置的时候加这个我们自己的启动任务)

很遗憾! 这种方法对有 imshow 这种窗口化的 opencv 是没用的!

下面的就是另一位博主写的上面说的这个方法,我拿过来贴在下面,这对于普通程序,例如你操作的都不包含窗口这些,print(1) 这样子逻辑代码的,那是没问题的!亲测过~ 但窗口的不行。
下面也有注明转载链接,请博主不用担心~

1.制作测试脚本
首先我们需要制作一个脚本来测试自启动是否有效。

pi@raspberry:~ $ nano /home/pi/start.sh

start.sh的内容如下:

/usr/bin/python3 /home/pi/GeometryOperations.py

这里一定要注意使用绝对路径,不然有概率会加载失败。

然后给脚本文件添加执行文件

pi@raspberry:~ $ chmod 777 start.sh

测试一下脚本功能

pi@raspberry:~ $ ./start.sh

如果观察到程序正常运行就可以继续下一步

2.添加自启动
修改rc.local文件

pi@raspberry:~ $ sudo nano /etc/rc.local

在文本中找到exit 0,在此之前添加的代码在启动时都会被执行,在exit 0 之前添加一行代码:

su pi -c “exec /home/pi/start.sh &”

ctrl+o保存,ctrl+x退出,重启。

pi@raspberry:~ $ sudo reboot

重启后程序即可运行。

3.DEBUG
如果重启后树莓派没有任何响应,可以通过systemctl查看一下rc-local的状态

pi@raspberry:~ $ sudo systemctl status rc-local

进去后就可以看到你开机启动后每一步的状态,检查哪里会报错。

4.可能会出现的报错

Process:454 ExecStart=/etc/rc.local start (code=exited,status=1/FAILURE)

这个出错大概是因为脚本文件的原因。
如果仅仅只是启动的话,那么一定要把文件路径写为绝对路径,不然就会报错。

error: (-2:Unspecified error) Can’t initialize GTK backend in function ‘cvInitSystem’

如果开机自启动的程序包含Opencv等具有窗口操作的代码则会报这种错误

原因是由于下面这一句引起

su pi -c “exec /home/pi/start.sh &”

如果你的命令需要长时间运行(例如死循环)或者运行后不能退出,那么你必须确保在命令的最后添加“&”符号让命令运行在其后台

而如果代码中包含类似于如下的窗口界面操作

cv2.namedWindow(‘Cap’)
cv2.imshow(‘Cap’, frame)

就会与后台运作冲突,使GTK的后端不能初始化,引发报错。
解决方法就是把有关于界面及窗口的操作全部删掉,程序即可良好运行啦!
以上转载至博主:TohkaQAQ
直转链接: https://blog.csdn.net/TohkaQAQ/article/details/121056564

通过上面博主所说,有了下面的结论!!!

结论与拓展

结论:
最初打算使用开机自启动进行程序启动,但一直失败,报错原因是:

error: (-2:Unspecified error) Can’t initialize GTK backend in function ‘cvInitSystem’

即:无法在函数“cvInitSystem”中初始化GTK后端

查看了上述引用的博主所说的:删掉语句,但我的需要,并不能删除。

分析:开机自启动任务进行方式是通过挂在后台进行任务运行,但是开机我们的程序都是使用的命令行操作,并不是开机后的图形化界面,试想一个只有文本运行的开机底层命令,怎会有摄像头,窗口展示这些功能操作呢?
所以如果程序中代码有调用窗口的命令存在,那就会报错。

在经过查阅国内外论坛后发现:国外也有相关此类问题的出现,但是从提问者提问到俩年后的今天,都没得出一个好的答案,且现在docker环境是一种流行趋势,许多使用者遇到的这个问题都是在远程操控中出现,而我方是采用本机本地运行的,方式不一,提出的是X11或MOBAXTER或修改DISPLAY对于我来说都是无效的,没有得到一个好的答案。

遂:将其改为开机后,双击桌面执行文件进行运行!(这是当时没想到办法只能另辟蹊径)
原因: 双击启动的走的命令行是我们开机后的命令行,这时的命令行去调用窗口这些的就没有问题了!!!

方法:
如果我们写了一个可执行程序需要经常运行,每次在命令行运行多有不便。如果刚好我们装的是桌面版的Linux, 这时我们就可以创建一个桌面图标,每次只要双击就可以运行程序。

以下例子是关于如何在Linux Ubuntu 18.04下创建一个桌面图标。22.4也可用,这玩意基本通用的。

  1. 搞个 .txt文件
  2. 把下面的这个丢进去,该改的地方改了!
  3. 把里面的test.py 或sh文件写了,确保待会是有东西可运行的!
[Desktop Entry] #桌面图标入口
Version=1.0 #版本号用于版本维护, 可选项可以没有
Type=Application #图标类型,可以是 Application, Link or Directory. 由于是执行程序所以是Application
Terminal=true #执行程序是否打开一个终端,程序有打印信息的话设为True,false就没命令行窗口弹出,但也是可双击运行的
Exec=/home/user/www/test.py #可执行文件的路径,你可以是hello_world.sh这种.sh文件,也可有是上面就写个python的
Name=啥名随你 #桌面图标的名字,最终在桌面图标显示的这个名字而不是文件名
Comment=Execture Hello WORLD #描述功能,可选项
Icon=/home/hgq/Desktop/helloworld.jpeg #图片的路径,美化图标用,这句也可以不用,但是用了你就要有这个图片

最后右键这个文件,重命名把他改为.desktop后缀的,再右键这文件把他设置为可运行就行,然后就可双击使用了。

后面觉得还是不行,有时间了,我得优化下,然后就得出了开篇的那个解决方法!

拓展:定时检测与重启

以上开机自启动就是可按照博主的去进行尝试吧,开机自启动并不是非常难! 然后定时检查是否启动与运行的可以看这位博主

直转链接:
https://blog.csdn.net/weixin_45977690/article/details/126656215

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sen°

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值