在银河麒麟系统中实现shell脚本开机自启需按场景选机制:gui脚本用.desktop(图形设置或autostart目录),无gui后台服务用systemd用户级服务,root级任务用systemd系统服务;禁用rc.local直接写入。

在银河麒麟操作系统中让一个Shell脚本开机自动运行,需根据脚本是否依赖图形界面、是否需要root权限、是否要求登录前启动来选择机制。直接往/etc/rc.local里写命令常失败,因为该文件在银河麒麟V10中默认不启用,且执行时无完整环境变量和网络就绪保障。
方法一:用图形设置添加.desktop启动项(适合带GUI或需X11的脚本)
第一步:给脚本加可执行权限。执行命令:chmod +x /home/kylin/scripts/myscript.sh。这一步漏掉会导致点击自启条目时静默失败,连错误提示都没有。
第二步:打开“开始菜单”→“设置”→“系统”→“开机启动”→“添加自启动程序”。
第三步:在弹出窗口中,“名称”填“我的监控脚本”,“命令”栏输入:/bin/bash -c "/home/kylin/scripts/myscript.sh"。必须显式调用/bin/bash,否则shell语法(如&&、$HOME)会失效。
第四步:点击“添加”,新条目右侧开关默认开启,立即生效。下次用户登录即自动运行。
方法二:手动部署.desktop到autostart目录(适合批量配置或绕过图形界面)
方法一仅限当前用户且依赖UKUI设置可用;若设置崩溃、远程部署或需脚本化操作,用此法更可靠。
创建.desktop文件:nano ~/.config/autostart/myscript.desktop,填入以下内容:
[Desktop Entry]
Name=挂载NFS共享
Type=Application
Exec=/bin/bash -c "/home/kylin/scripts/nfs-mount.sh"
Terminal=false
Hidden=false
StartupNotify=false
【Exec字段必须用绝对路径,且显式调用/bin/bash】。省略-c参数会导致脚本内重定向、管道等失效;不写/bin/bash则无法解析$(date)等扩展。
执行mkdir -p ~/.config/autostart && chmod 644 ~/.config/autostart/myscript.desktop。权限不是755——desktop规范只要求可读,设为755反而可能被桌面环境拒绝加载。
方法三:配置systemd用户级服务(适合无GUI、需进程守护的后台脚本)
此方式在用户登录前即启动,支持自动重启、日志追踪和依赖声明,比.desktop更健壮。
① 创建服务文件:mkdir -p ~/.config/systemd/user && nano ~/.config/systemd/user/nfs-mount.service
② 写入内容(注意替换实际路径):
[Unit]
Description=NFS挂载服务
After=network.target
Wants=network.target
[Service]
Type=oneshot
ExecStart=/home/kylin/scripts/nfs-mount.sh
RemainAfterExit=yes
User=kylin
[Install]
WantedBy=default.target
③ 启用并启动:systemctl --user daemon-reload && systemctl --user enable --now nfs-mount.service。执行后立刻生效,无需重启。
④ 验证是否运行:systemctl --user status nfs-mount.service。若报“Failed to connect to bus”,说明用户级dbus未启动,需先运行loginctl enable-linger $USER。
方法四:用rc.local实现系统级自启(仅限需root权限且不依赖桌面的脚本)
银河麒麟V10默认禁用rc.local,且执行时机早于网络就绪,直接写mount -t nfs必失败。
方法1:启用rc.local并加延迟等待
执行sudo systemctl enable rc-local启用服务;编辑sudo nano /etc/rc.local,在exit 0前插入:
sleep 15
sudo -u kylin /bin/bash /home/kylin/scripts/nfs-mount.sh > /tmp/rclocal.log 2>&1
方法2:改用systemd系统服务(更推荐)
创建sudo nano /etc/systemd/system/nfs-mount-sys.service,内容含After=network-online.target和Wants=network-online.target,再sudo systemctl daemon-reload && sudo systemctl enable --now nfs-mount-sys.service。











