news 2026/4/18 8:23:47

测试开机启动脚本完整指南,涵盖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/18 7:46:57

SSCom全链路串口调试效能优化指南:从入门到精通

SSCom全链路串口调试效能优化指南&#xff1a;从入门到精通 【免费下载链接】sscom Linux/Mac版本 串口调试助手 项目地址: https://gitcode.com/gh_mirrors/ss/sscom 串口调试总在关键时刻掉链子&#xff1f;设备连接超时、数据乱码、跨平台兼容性问题让开发效率大打折…

作者头像 李华
网站建设 2026/4/18 8:00:15

智能打卡自动化工具完全指南:免Root配置与多场景应用

智能打卡自动化工具完全指南&#xff1a;免Root配置与多场景应用 【免费下载链接】AutoDingding 钉钉自动打卡 项目地址: https://gitcode.com/gh_mirrors/au/AutoDingding 忘记打卡被罚款&#xff1f;智能打卡方案来了&#xff01;本文将详细介绍一款免Root的自动化打卡…

作者头像 李华
网站建设 2026/4/16 14:40:55

多屏调节与护眼完美结合:Twinkle Tray如何重塑你的显示体验

多屏调节与护眼完美结合&#xff1a;Twinkle Tray如何重塑你的显示体验 【免费下载链接】twinkle-tray Easily manage the brightness of your monitors in Windows from the system tray 项目地址: https://gitcode.com/gh_mirrors/tw/twinkle-tray 在现代办公与娱乐场…

作者头像 李华
网站建设 2026/4/1 10:26:03

BaiduPCS-Go:命令行百度网盘管理的革命性工具

BaiduPCS-Go&#xff1a;命令行百度网盘管理的革命性工具 【免费下载链接】BaiduPCS-Go 项目地址: https://gitcode.com/gh_mirrors/baid/BaiduPCS-Go 还在为百度网盘的限速和繁琐操作而头疼吗&#xff1f;BaiduPCS-Go 作为一款基于 Go 语言开发的命令行百度网盘客户端…

作者头像 李华
网站建设 2026/4/17 15:24:25

Magpie效率提升指南:低配电脑窗口放大流畅运行解决方案

Magpie效率提升指南&#xff1a;低配电脑窗口放大流畅运行解决方案 【免费下载链接】Magpie An all-purpose window upscaler for Windows 10/11. 项目地址: https://gitcode.com/gh_mirrors/mag/Magpie 在日常办公与娱乐中&#xff0c;许多用户希望通过Magpie实现窗口放…

作者头像 李华
网站建设 2026/4/16 16:55:41

3个步骤安全保存知乎内容,从此告别丢失风险

3个步骤安全保存知乎内容&#xff0c;从此告别丢失风险 【免费下载链接】zhihu_spider_selenium 爬取知乎个人主页的想法、文篇和回答 项目地址: https://gitcode.com/gh_mirrors/zh/zhihu_spider_selenium 你是否想过&#xff0c;当你在知乎上精心创作的技术回答、深度…

作者头像 李华