一、前言
一般将系统用作嵌入式设备时肯定要布置某些程序,这时候就需要对程序设置开机自己,否则每次都要人为启动,当有些嵌入式系统未连接显示屏或者无桌面环境去操作启动程序时,程序自启就是必须的了,本文介绍在纯linux系统下开机自启方法,还有Ubuntu/麒麟系统下程序和服务开机自启的方法
目录
二、环境
RK3588(linux5.10.66+debian/ubuntu/麒麟是桌面文件系统)
调试笔记本window10,安装常用工具winscp,xshell,finalshell,secureRTP等等
VMware17+Ubuntu20.04源码开发环境(这里就依赖于各个硬件平台的厂家提供资料了)
三、正文
纯linux下qt程序开机自启
在目标设备中直接操作etc/init.d/S99autorun.sh文件,如果想编译的镜像就设置好,就去源码包中找到文件系统,需要挂载文件系统,之后进入文件系统对自启动配置进行更改。在外部命令创建etc/init.d/S99autorun.sh文件,在指定打开loop.sh,再打开指定程序
最后程序权限别忘记了设置,至少得+x,我都是777 使用chmod命令
相关文件内容:
#!/bin/bash
source /root/loop.sh &
#! /bin/sh
echo "starting kbqSource... "
./root/workspace/Testdemo &
exit 0
本方法是开机系统默认启动S99autorun.sh(这里不同厂家的设备可能会略微有区别)
之后打开指定路径的loop.sh脚本
之后再通过脚本启动指定路径的程序文件(程序要有执行权限)
大功告成
ubuntu/麒麟系统qt程序开机自启
在root用户下操作
进入/etc/xdg/autostart
创建一个test.desktop文件,文件名不一定必须是test,可以更改,后缀不能变
修改test.desktop文件,内容如下:
[Desktop Entry]
#软件文字编码
Encoding=UTF-8
#软件名称
Name=CAN调试助手
#软件类型(固定)
Type=Application
#软件位置,应用程序可执行文件的绝对路径
Exec=/root/workspace/RK3588porttest_CAN
#软件启动是否在终端中运行
Terminal=true
#是否应该在应用程序启动时显示通知
StartupNotify=true
#软件图标,图标的绝对路径
Icon=/root/workspace/logo200x200.png
#软件隐藏、不显示
Hidden=false
NoDisplay=false
#软件描述说明
Comment=这事一个说明,CAN调试助手工具,拥有美观的界面和舒适的操作.
#软件版本
Version=1.0.0
#设置为true,使得这个.desktop文件在GNOME桌面环境中生效。
X-GNOME-Autostart-enabled=true
# 主要用于菜单展示归类
Categories=Application;Development;
将test.desktop复制到/usr/share/applications/中也就制作了一个快捷方式(在开始菜单中显示)。
最后再将程序放在指令路径下,别忘记了加权限
这个方式同样也适合在源码中文件系统随系统打包好
总结:
/etc/xdg/autostart路径下的desktop文件是能够自启的程序(这里必须有desktop文件)
/usr/share/applications路径下的desktop文件是能够放在菜单界面显示的程序(这里可以没有,不影响开机自启)
test.desktop赋值权限777后可以在桌面环境双击运行,双击运行时Terminal=true则开启终端
也可以将desktop文件放在/usr/share/applications路径下,然后通过系统的设置开机自启功能中选择自启软件
自启效果

ubuntu/麒麟系统服务开机自启
有的时候系统自启的外部软件不一定非得是qt程序,也有可能是启动某种后台服务,这个时候就要设置服务开机自启
这里我以自动启动python程序为例,通过设置自启服务的方式去打开,而不是使用desktop自启文件,当然qt程序也可以不用desktop自启文件而使用服务,因为服务中有崩溃自启机制,当程序崩溃后可以自动重启软件
下面介绍后台运行的 Python 程序(如服务、守护进程)自动启动方法
- 创建 systemd 服务文件
sudo vim /etc/systemd/system/SY_pytest_redis_matplotlib.service
内容示例(根据实际路径修改):
[Unit]
Description=My Python Application
After=network.target
[Service]
#User=kylin # 改为你的用户名
Type=simple
WorkingDirectory=/root/workspace
ExecStart=/usr/bin/python /root/workspace/pytest_redis_matplotlib.py
Restart=always # 崩溃后自动重启
RestartSec=5 # 服务崩溃等待5秒重启,若没有此属性,默认1秒重启,必须有Restart=always
Environment="PYTHONUNBUFFERED=1" # 确保日志实时输出
[Install]
WantedBy=multi-user.target
- 启用服务
sudo systemctl daemon-reload
sudo systemctl enable SY_pytest_redis_matplotlib # 开机自启
sudo systemctl start SY_pytest_redis_matplotlib # 立即启动
3.验证状态
sudo systemctl status SY_pytest_redis_matplotlib
确保服务状态为active (running)
查看日志(实时)
journalctl -u SY_pytest_redis_matplotlib -f
查看日志(历史)
journalctl -u SY_pytest_redis_matplotlib -xe --no-pager
取消自启并彻底移除服务
禁用开机自启(必须步骤)
sudo systemctl disable <服务名>.service
停止正在运行的服务
sudo systemctl stop <服务名>.service
删除服务文件(可选)
sudo rm /etc/systemd/system/<服务名>.service
重新加载 systemd
sudo systemctl daemon-reload
检查是否已禁用
systemctl is-enabled <服务名> # 应显示 "disabled"
检查服务状态
systemctl status <服务名> # 应显示 "inactive (dead)"
这里我让AI帮我生成多个服务开启使用server_setautostart.sh脚本,将服务文件复制到/etc/systemd/system/
赋值脚本权限chmod +x server_setautostart.sh
执行脚本bash server_setautostart.sh
这样所有服务就全部自动配置完启动了(顺利的话)
server_setautostart.sh内容如下:
#!/bin/bash
# 定义服务列表
SERVICES=(
"SY_pytest_redis_matplotlib"
"SY_pytest_redis_numpy"
"SY_pytest_redis_pandas"
"SY_pytest_redis_scikitlearn"
"SY_pytest_redis_tensorflow"
)
# 遍历所有服务,依次检查、启用并启动
for service in "${SERVICES[@]}"; do
SERVICE_FILE="/etc/systemd/system/${service}.service"
echo "正在设置服务: $service"
# 检查服务文件是否存在
if [ ! -f "$SERVICE_FILE" ]; then
echo "❌ 错误:服务文件 $SERVICE_FILE 不存在,请检查!"
continue # 跳过当前服务
fi
# 重新加载 systemd(避免修改后未生效)
sudo systemctl daemon-reload
# 启用开机自启
sudo systemctl enable "$service"
if [ $? -eq 0 ]; then
echo "✅ $service 开机自启设置成功"
else
echo "❌ $service 开机自启设置失败,请检查服务文件配置"
continue
fi
# 立即启动服务
sudo systemctl start "$service"
if [ $? -eq 0 ]; then
echo "✅ $service 启动成功"
else
echo "❌ $service 启动失败,请查看日志: journalctl -u $service -xe"
fi
echo "----------------------------------------"
done
echo "所有服务设置完成!"
四、结语
随着时代的发展,在工作中用到了越来越多的AI,帮助工作提升了很大的效率,但我认为AI只能作为人类的工具,逐步取代其他落后的工具,AI的出现让很多技术实现起来并不需要最专业的人士,对以往的高端顶尖人才肯定是有打击,适合大部分对专业了解一些的人和几年工龄的工程师,使用AI的前提就是知道如何问问题,让AI给出你的答案,整体来说,AI肯定会推进人类进步,这也是人类几十年的积累,厚积薄发。我的文章可能会被AI索引,作为几万分之一的一个小数据,最后总结出来最精华的部分给需要的人,也希望我的文章能够直接帮助到有需要的人。
继续努力前进吧骚年,在不努力普通工程师很可能被普通外行人随便替代了