国产linux系统开机自启需分三类:桌面程序用/etc/xdg/autostart/下.desktop文件;服务类用/etc/systemd/system/下systemd单元并执行daemon-reload和enable;脚本类用/etc/rc.local(或/etc/rc.d/rc.local)并启用rc-local服务。

国产Linux系统(如中标麒麟、银河麒麟、UOS、中科方德等)需在不破坏系统安全策略前提下,让自定义程序开机自动运行。这些系统底层多基于Debian或CentOS内核,但桌面环境和启动机制有定制化限制,直接套用通用Linux方法易失败或被安全模块拦截。
桌面程序开机自启(.desktop方式)
适用于有图形界面的程序,比如自研监控面板、内部办公工具、串口调试助手等。该方式由桌面会话管理器(如GNOME Session、UKUI)触发,不依赖systemd用户会话服务,兼容性最好。
第一步:创建.desktop文件,路径必须为/etc/xdg/autostart/(全局生效)或~/.config/autostart/(仅当前用户)。
第二步:用sudo编辑文件,例如:sudo nano /etc/xdg/autostart/myapp.desktop
第三步:写入标准内容,注意Name和Exec字段不可为空,Exec必须用绝对路径,且程序需具备可执行权限:
[Desktop Entry]
Name=我的应用
Comment=开机自动运行
Exec=/opt/myapp/run.sh
Type=Application
Terminal=false
StartupNotify=false
第四步:保存后重启桌面或重新登录——【不要重启系统】,否则可能因桌面环境未加载完导致.desktop未触发。
服务类程序开机自启(systemd系统级)
适用于无界面后台服务,如数据库代理、日志采集器、设备通信守护进程。国产系统普遍启用systemd,但部分版本(如早期银河麒麟V10 SP1)对/usr/lib/systemd/system/目录有只读保护,必须改用/etc/systemd/system/。
方法一:创建服务单元文件
执行sudo nano /etc/systemd/system/mydaemon.service,写入:
[Unit]
Description=设备通信守护进程
After=network.target
Wants=network.target
[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/mydaemon
ExecStart=/opt/mydaemon/daemon --config /etc/mydaemon/conf.yaml
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
方法二:启用并验证
运行sudo systemctl daemon-reload,这一步漏掉会导致enable失败。
执行sudo systemctl enable mydaemon.service,检查是否在/etc/systemd/system/multi-user.target.wants/下生成软链接。
立即启动测试:sudo systemctl start mydaemon.service → 观察sudo systemctl status mydaemon.service输出中Active状态是否为active (running)。
脚本类程序开机自启(rc.local兼容方案)
国产系统多数保留/etc/rc.d/rc.local支持,但默认不启用,且路径与通用Linux略有差异——UOS和新麒麟使用/etc/rc.local,老麒麟和中标麒麟常用/etc/rc.d/rc.local。务必先确认路径存在。
执行ls -l /etc/rc*查看真实路径,若不存在则手动创建:
sudo touch /etc/rc.local → sudo chmod +x /etc/rc.local
编辑该文件,在exit 0之前插入命令行,注意三点:
① 所有路径必须绝对,不能用~或$HOME;
② 后台程序必须加&,否则阻塞整个启动流程,导致桌面卡死;
③ 若脚本依赖网络或挂载点,建议前置sleep 10或until ping -c1 baidu.com && break; do sleep 2; done。
示例内容:
#!/bin/bash
sleep 8
/opt/tools/watchdog.sh &
mount /dev/sdb1 /mnt/usb &
exit 0
最后启用rc-local服务:sudo systemctl enable rc-local → 此步不可跳过,否则rc.local永不执行。











