news 2026/4/23 18:16:02

测试开机启动脚本完整指南,涵盖rc.local和init.d方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
测试开机启动脚本完整指南,涵盖rc.local和init.d方法

测试开机启动脚本完整指南,涵盖rc.local和init.d方法

在Linux系统运维和嵌入式开发中,让自定义脚本在系统启动时自动运行是一项基础但关键的能力。无论是工控设备的初始化配置、服务监控脚本的常驻运行,还是桌面环境下的自动化任务,掌握可靠的开机启动机制都能显著提升系统的稳定性和可维护性。本文不讲抽象理论,只聚焦一个真实可用的测试场景:如何让一段简单的test.sh脚本在Ubuntu系统开机时成功执行,并清晰对比/etc/init.d/etc/rc.local两种主流方法的适用边界、操作细节与常见陷阱。

全文基于实际验证环境(Ubuntu 20.04/22.04),所有命令均可直接复用,每一步都标注了执行前提、预期效果和典型问题排查路径。你不需要是系统专家,只要能打开终端,就能照着完成。

1. 明确目标与测试脚本准备

在动手前,先确认我们要达成什么——不是“让脚本存在”,而是“让脚本在正确时机、以正确权限、可靠地执行并留下可验证痕迹”。

1.1 测试脚本内容与作用

我们使用如下test.sh作为统一测试载体:

#!/bin/bash # test.sh cd /home/Desktop/ ls echo "OK!" > /tmp/test_startup.log exit 0

为什么这样写?

  • cd /home/Desktop/ls验证脚本是否具备用户级文件系统访问能力;
  • echo "OK!" > /tmp/test_startup.log将结果写入全局可读的临时文件,避免因用户未登录导致日志不可见;
  • exit 0确保脚本明确返回成功状态,防止系统误判为失败而中断后续流程。

重要提醒:请将脚本保存在/home/用户名/Desktop/(注意替换用户名为你的实际用户名),并赋予可执行权限:

chmod +x /home/用户名/Desktop/test.sh

1.2 验证脚本能否手动运行

在继续之前,请务必先手动执行一次,确认脚本本身无语法错误且路径正确:

/home/用户名/Desktop/test.sh cat /tmp/test_startup.log # 应输出 OK!

如果这一步失败,后续所有开机启动方法都会无效。这是最常被忽略却最关键的前置检查。

2. /etc/init.d 方法:传统SysV风格的标准化方案

/etc/init.d是Linux系统中管理服务启动的标准目录,其优势在于与系统运行级别(runlevel)深度集成,支持启动顺序控制、依赖管理及服务状态查询。虽然现代Ubuntu默认使用systemd,但update-rc.d工具仍能良好兼容,尤其适合需要精细控制启动时机的场景。

2.1 脚本迁移与权限设置

将测试脚本复制到/etc/init.d/目录,并确保其具备可执行权限:

sudo cp /home/用户名/Desktop/test.sh /etc/init.d/test-startup sudo chmod +x /etc/init.d/test-startup

注意命名规范:建议使用test-startup而非test.sh,避免点号引发解析歧义;文件名中不要包含空格或特殊字符。

2.2 注册为系统服务

使用update-rc.d命令将其注册为开机启动服务:

sudo update-rc.d test-startup defaults

该命令等价于在/etc/rc?.d/目录下创建符号链接(如S20test-startup),表示在运行级别2-5(多用户图形界面模式)下,以优先级20启动该脚本。

若需调整启动顺序(例如确保在网络服务之后运行):

# 数字越大,启动越晚;范围通常为01-99 sudo update-rc.d test-startup defaults 90

2.3 启动与状态验证

立即测试服务是否可手动触发:

sudo service test-startup start cat /tmp/test_startup.log # 应输出 OK!

重启系统后,再次检查日志:

cat /tmp/test_startup.log

预期结果:日志中应仅有一行OK!(多次重启不会重复追加,因使用>覆盖写入)。

2.4 常见问题与排查

  • 问题:脚本未执行,/tmp/test_startup.log为空
    检查/var/log/syslog中是否有类似test-startup: not found的报错,大概率是脚本首行#!/bin/bash缺失或路径错误。

  • 问题:ls命令无输出,但日志有OK!
    表明脚本已执行,但cd /home/Desktop/失败。原因通常是:/etc/init.d脚本以root身份运行,而/home/Desktop/属于普通用户目录,root无权访问。解决方案:将cdls移除,或改用绝对路径如/home/用户名/Desktop/,并在脚本开头添加su -c "ls" 用户名(不推荐,复杂化)。

  • 问题:想取消启动
    执行以下命令彻底移除:

    sudo update-rc.d -f test-startup remove sudo rm /etc/init.d/test-startup

3. /etc/rc.local 方法:轻量级、易理解的通用方案

/etc/rc.local是一个特殊的shell脚本,在系统初始化末期、所有其他服务启动完成后执行。它不依赖特定init系统,语法简单,对新手友好,是快速验证脚本启动逻辑的首选方式。

3.1 编辑rc.local文件

Ubuntu 20.04+ 默认禁用rc.local,需先启用:

sudo systemctl enable rc-local

然后编辑文件:

sudo nano /etc/rc.local

exit 0之前插入你的调用命令:

#!/bin/sh -e # # rc.local # # 在此处添加你的命令 cd /home/用户名/Desktop/ && ./test.sh exit 0

关键细节

  • 必须保留#!/bin/sh -e首行,-e参数确保任一命令失败即退出;
  • cd./test.sh&&连接,保证路径切换成功后才执行脚本;
  • 所有路径必须为绝对路径,不能使用~$HOME

3.2 权限与重启验证

确保rc.local自身可执行:

sudo chmod +x /etc/rc.local

重启系统后检查:

cat /tmp/test_startup.log # 应输出 OK!

3.3 为什么rc.local有时“不工作”?

这是最常被问到的问题,根本原因在于执行时机与用户上下文

  • rc.local在系统级初始化阶段运行,此时图形界面(X11/Wayland)尚未启动,/home/用户名/Desktop/可能还未挂载或权限受限;
  • 脚本以root身份运行,无法直接访问用户桌面环境变量(如DISPLAY);
  • 若脚本依赖GUI组件(如gnome-terminal),在此处调用必然失败。

验证方法:在rc.local中添加一行日志:

date >> /tmp/rclocal_test.log

重启后查看该文件是否存在时间戳。若存在,说明rc.local已执行;若不存在,则rc-local服务未启用或配置错误。

4. 桌面环境专用方案:gnome-session-properties

当你的脚本必须在用户登录桌面后运行(例如需要显示GUI窗口、访问用户配置、操作桌面文件),/etc/init.d/etc/rc.local均不适用。此时应使用桌面会话管理器提供的启动应用功能。

4.1 图形化配置流程

  1. 打开“启动应用程序”工具:
    gnome-session-properties
  2. 点击“添加”按钮;
  3. 填写信息:
    • 名称:Test Startup Script
    • 命令/home/用户名/Desktop/test.sh
    • 注释:可选,描述用途
  4. 点击“添加”,关闭窗口。

4.2 命令行等效操作

上述操作本质是向用户目录写入一个.desktop文件:

cat > ~/.config/autostart/test-startup.desktop << 'EOF' [Desktop Entry] Type=Application Exec=/home/用户名/Desktop/test.sh Hidden=false NoDisplay=false X-GNOME-Autostart-enabled=true Name=Test Startup Script Comment=Run test script on login EOF chmod +x ~/.config/autostart/test-startup.desktop

4.3 适用场景与限制

  • 适合:需要访问用户主目录、桌面环境、GUI工具的脚本;
  • ❌ 不适合:系统级服务、无人值守工控机(需自动登录)、多用户共享机器;
  • 注意:此方法仅在用户图形登录后触发,若系统设为自动登录,效果等同于开机即执行。

5. 方法对比与选型建议

面对三种方案,如何选择?核心原则是:匹配需求,最小权限,最大可靠。下表从五个维度进行客观对比:

维度/etc/init.d/etc/rc.localgnome-session-properties
执行时机系统初始化中期(网络就绪后)系统初始化末期(所有服务启动后)用户图形会话建立后
执行用户rootroot当前登录用户
GUI支持❌ 无显示环境❌ 无显示环境完全支持
配置复杂度中(需注册、理解优先级)低(编辑一个文件)低(图形界面或写desktop文件)
适用场景系统服务、后台守护进程、工控初始化简单系统级任务、环境预配置桌面自动化、用户级工具启动

选型决策树

  • 如果脚本需操作硬件、配置内核模块、监听系统端口 → 选/etc/init.d
  • 如果脚本只需执行一条命令(如挂载磁盘、设置环境变量)且不依赖GUI → 选/etc/rc.local
  • 如果脚本要弹出窗口、调用notify-send、处理用户文档 → 选gnome-session-properties

6. 进阶技巧与工程化建议

在真实项目中,仅让脚本“跑起来”远远不够。以下是经过实践检验的加固建议:

6.1 日志集中管理

避免散落各处的日志,统一重定向到/var/log/

# 修改test.sh中的echo行 echo "$(date): OK!" >> /var/log/test-startup.log

并确保日志目录可写:

sudo touch /var/log/test-startup.log sudo chown root:adm /var/log/test-startup.log sudo chmod 644 /var/log/test-startup.log

6.2 启动超时与重试机制

对于依赖网络的服务,增加等待逻辑:

# 在test.sh开头添加 for i in {1..60}; do ping -c1 8.8.8.8 &>/dev/null && break sleep 1 done

6.3 权限最小化原则

/etc/init.d脚本默认以root运行,但若只需用户级权限,可在脚本中降权:

# 替换原脚本中的cd和ls部分 su -c "/home/用户名/Desktop/test.sh" 用户名

6.4 systemd原生替代方案(未来兼容)

虽然本文聚焦传统方法,但了解现代化路径很有必要。若需长期维护,可将脚本封装为systemd服务:

sudo tee /etc/systemd/system/test-startup.service << 'EOF' [Unit] Description=Test Startup Script After=network.target [Service] Type=oneshot ExecStart=/home/用户名/Desktop/test.sh User=用户名 RemainAfterExit=yes [Install] WantedBy=multi-user.target EOF sudo systemctl daemon-reload sudo systemctl enable test-startup.service

此方案更符合当前Ubuntu发展方向,且日志可通过journalctl -u test-startup.service统一查看。

7. 总结:从验证到落地的关键认知

本文通过一个极简的test.sh,完整走通了Linux开机启动的三条主流路径。但比操作步骤更重要的是背后的设计哲学:

  • /etc/init.d不是过时技术,而是可控性的代名词:当你需要决定“我的脚本必须在网络之后、数据库之前启动”,它仍是不可替代的工具;
  • /etc/rc.local的价值在于“所见即所得”的调试效率:它让你快速验证脚本逻辑,是排除环境干扰的第一道筛子;
  • 桌面启动方案不是妥协,而是职责分离的体现:系统层负责基础设施,用户层负责个性化体验,二者不该混为一谈。

最后强调一个铁律:任何开机启动脚本,上线前必须在目标环境中完成三次完整重启测试。第一次验证基础功能,第二次验证异常恢复(如断电重启),第三次验证多用户并发(如远程SSH登录后触发)。只有经过这三重考验,才能称之为“可靠”。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 9:50:52

Windows 11如何畅玩经典局域网游戏?IPXWrapper让老游戏重获新生

Windows 11如何畅玩经典局域网游戏&#xff1f;IPXWrapper让老游戏重获新生 【免费下载链接】ipxwrapper 项目地址: https://gitcode.com/gh_mirrors/ip/ipxwrapper 当你在Windows 11上双击《红色警戒2》的启动程序&#xff0c;准备与好友来一场紧张刺激的局域网对战时…

作者头像 李华
网站建设 2026/4/23 9:50:19

复活经典局域网游戏:IPXWrapper拯救Windows 11游戏连接难题

复活经典局域网游戏&#xff1a;IPXWrapper拯救Windows 11游戏连接难题 【免费下载链接】ipxwrapper 项目地址: https://gitcode.com/gh_mirrors/ip/ipxwrapper 当你双击《红色警戒2》启动程序&#xff0c;准备与好友展开局域网对战时&#xff0c;却发现游戏无法识别网…

作者头像 李华
网站建设 2026/4/23 16:05:53

亲测YOLO11镜像,AI目标检测真实体验分享

亲测YOLO11镜像&#xff0c;AI目标检测真实体验分享 这不是一篇讲原理的论文&#xff0c;也不是一份照本宣科的文档。这是我用YOLO11镜像跑通第一个检测任务后&#xff0c;把键盘敲热、把报错看遍、把结果截图存满相册的真实记录。没有“理论上可行”&#xff0c;只有“我试过了…

作者头像 李华
网站建设 2026/4/23 13:48:50

7个步骤掌握终极窗口控制:Window Resizer完全指南

7个步骤掌握终极窗口控制&#xff1a;Window Resizer完全指南 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 你是否曾因无法调整特定程序窗口大小而困扰&#xff1f;当设计软件、…

作者头像 李华
网站建设 2026/4/23 13:03:45

10分钟上手FSMN-VAD:镜像环境一键部署实操手册

10分钟上手FSMN-VAD&#xff1a;镜像环境一键部署实操手册 1. 这不是“又一个语音检测工具”&#xff0c;而是你马上能用的离线VAD控制台 你有没有遇到过这样的情况&#xff1a;手头有一段30分钟的会议录音&#xff0c;想喂给语音识别模型&#xff0c;结果发现前5分钟全是空调…

作者头像 李华
网站建设 2026/4/23 16:15:35

SGLang游戏NPC对话:动态剧情生成部署案例

SGLang游戏NPC对话&#xff1a;动态剧情生成部署案例 1. 引言&#xff1a;当AI成为游戏世界的“编剧” 你有没有想过&#xff0c;游戏里的NPC不再只是机械地重复几句台词&#xff0c;而是能根据你的选择实时生成对话、推动剧情发展&#xff1f;不再是预设脚本的循环播放&…

作者头像 李华