news 2026/5/23 9:22:44

测试开机启动脚本支持多种运行级别配置说明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
测试开机启动脚本支持多种运行级别配置说明

测试开机启动脚本支持多种运行级别配置说明

1. 开机自启动的核心逻辑与适用场景

你是否遇到过这样的问题:写好了一个监控脚本、数据采集程序或服务初始化工具,却总在重启后发现它没自动运行?或者明明配置了启动项,却在某些运行级别下失效?这背后其实涉及Linux系统启动流程中一个关键机制——运行级别(Runlevel)控制。

运行级别决定了系统启动时加载哪些服务和脚本。Ubuntu虽已逐步转向systemd,但在许多嵌入式设备、工控机、老旧服务器或定制化镜像中,传统的SysV init机制仍被广泛使用。本镜像“测试开机启动脚本”正是为验证不同运行级别下的脚本兼容性而设计,它不依赖图形界面,也不强求systemd环境,专注在最基础的init层级提供稳定、可复现的启动行为。

本文将带你实测三种主流方案:/etc/init.d+update-rc.d(最标准)、rc.local(最轻量)、以及桌面级的gnome-session-properties(最直观)。每种方法都明确标注其生效的运行级别、执行时机、权限要求和典型故障点。所有操作均基于真实终端复现,代码可直接复制粘贴运行,无需额外安装依赖。

提示:本文所有命令均在Ubuntu 20.04/22.04桌面版及Server版实测通过;若使用其他发行版(如CentOS/RHEL),请优先确认系统是否启用SysV init兼容层。

2. /etc/init.d 方案:标准、可控、支持多运行级别

这是最符合Linux传统规范的启动管理方式,适用于需要精细控制启动顺序、依赖关系和运行级别的场景。它天然支持SysV定义的7个运行级别(0–6),其中最常用的是:

  • 运行级别2:多用户模式(无NFS,桌面环境默认)
  • 运行级别3:完全多用户模式(命令行界面,服务器常用)
  • 运行级别5:带图形界面的多用户模式(桌面环境)

2.1 脚本准备与权限设置

首先确保你的测试脚本具备可执行权限,并放置在标准路径:

#!/bin/bash # /home/Desktop/test.sh cd /home/Desktop/ ls -l echo " test.sh executed at $(date)" exit 0

注意两点:

  • 脚本首行必须是#!/bin/bash(或#!/bin/sh),否则init无法识别解释器;
  • 建议使用绝对路径(如/home/Desktop/),避免因工作目录不确定导致命令失败。

然后将其复制到/etc/init.d/并授权:

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

✦ 小技巧:脚本名建议不带.sh后缀(如用test-startup而非test.sh),避免部分init系统误判类型。

2.2 注册为系统服务并指定运行级别

使用update-rc.d命令注册服务。该命令本质是创建指向/etc/rc?.d/目录的符号链接,其中?即运行级别编号:

# 默认启用:在运行级别2、3、4、5启动,在0、1、6停止 sudo update-rc.d test-startup defaults

这条命令会在以下路径生成链接:

  • /etc/rc2.d/S20test-startup→ 启动(S=Start,20=优先级)
  • /etc/rc3.d/S20test-startup
  • /etc/rc4.d/S20test-startup
  • /etc/rc5.d/S20test-startup
  • /etc/rc0.d/K20test-startup→ 停止(K=Kill)
  • /etc/rc1.d/K20test-startup
  • /etc/rc6.d/K20test-startup

如需自定义运行级别(例如仅在命令行模式3启动,不进入图形界面5),可显式指定:

# 仅在运行级别3启动,不启用其他级别 sudo update-rc.d test-startup start 99 3 . stop 99 0 1 6 .

参数含义:

  • start 99 3 .:在运行级别3以优先级99启动(数字越大越晚执行)
  • stop 99 0 1 6 .:在运行级别0/1/6以优先级99停止
  • .表示结束参数列表

2.3 启用、禁用与卸载服务

临时禁用某服务(保留配置,下次可快速启用):

sudo update-rc.d test-startup disable # 或仅禁用特定级别 sudo update-rc.d test-startup disable 3

彻底移除服务注册(删除所有rc?.d链接):

sudo update-rc.d -f test-startup remove

注意:-f参数为强制移除,不可省略;否则会提示“no such file”。

3. rc.local 方案:简单、通用、适合早期初始化

/etc/rc.local是SysV init中一个特殊的“兜底脚本”,它在大多数系统服务启动之后、登录提示出现之前执行。它的最大优势是:不依赖任何服务框架,只要init存在就能运行,非常适合硬件初始化、挂载设备、启动守护进程等底层任务。

3.1 配置步骤与关键细节

编辑/etc/rc.local(需root权限):

sudo nano /etc/rc.local

exit 0之前插入你的命令(务必使用绝对路径):

#!/bin/sh -e # # rc.local # # 确保脚本有执行权限 chmod +x /home/Desktop/test.sh # 执行测试脚本(添加&后台运行可避免阻塞启动) su -c "/home/Desktop/test.sh" -s /bin/bash user_name & exit 0

重要说明:

  • su -c用于以普通用户身份运行(避免脚本因root权限缺失文件访问失败);
  • &符号使脚本后台执行,防止因等待I/O或超时导致系统卡在启动阶段;
  • user_name替换为实际用户名(如ubuntuadmin);
  • 若脚本依赖图形环境(如调用notify-send),此方法不适用——因为rc.local在图形会话启动前就已执行完毕。

3.2 故障排查要点

若脚本未执行,请按顺序检查:

  1. 确认/etc/rc.local具备可执行权限

    sudo chmod +x /etc/rc.local
  2. 查看系统日志定位错误

    sudo journalctl -u rc-local --no-pager | tail -20 # 或传统方式 sudo cat /var/log/syslog | grep rc.local
  3. 验证脚本本身能否手动运行

    sudo /home/Desktop/test.sh # 模拟rc.local执行环境

✦ 实测经验:在工控机或树莓派等无GUI设备上,rc.local是最可靠的选择;但Ubuntu 22.04+默认可能禁用该服务,需额外启用:

sudo systemctl enable rc-local

4. 桌面级自启动方案:面向用户会话,图形环境专属

当你的脚本需要与桌面交互(如弹窗提醒、打开终端、调用GUI应用),或仅希望当前用户登录后才运行,则应选择桌面会话级启动方式。本方案完全绕过系统级init,由GNOME桌面环境接管,因此只在运行级别5(图形模式)下生效

4.1 使用 gnome-session-properties 图形界面配置

这是最直观的方式,适合不熟悉命令行的用户:

  1. 打开“启动应用程序”:
    gnome-session-properties
  2. 点击“添加”按钮;
  3. 填写信息:
    • 名称:Test Startup Script
    • 命令:/home/Desktop/test.sh
    • 注释:Run test script on login
  4. 点击“添加”,重启系统即可。

✦ 优势:无需sudo权限,配置保存在用户家目录(~/.config/autostart/),不影响其他用户。

4.2 终端模拟启动:gnome-terminal 方式

若脚本需在终端中可见输出(便于调试),可用gnome-terminal启动:

gnome-terminal -- bash -c "/home/Desktop/test.sh; exec bash"
  • --分隔终端命令与后续参数;
  • exec bash保证终端窗口不闪退,方便查看输出结果。

你也可以将其写入~/.bashrc的末尾(不推荐用于生产环境,因每次打开终端都会执行):

# 添加到 ~/.bashrc 最后一行 if [ -n "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then /home/Desktop/test.sh > /tmp/test.log 2>&1 & fi

注意:~/.bashrc在非登录shell中也会加载(如VS Code终端),可能导致重复执行;建议加条件判断(如检测$DISPLAYtty)。

5. 运行级别对照与方案选型指南

不同方案生效的运行级别差异,直接决定了它们的适用边界。下表为你清晰梳理:

方案支持运行级别执行时机用户上下文典型适用场景是否需root
/etc/init.d+update-rc.d0,1,2,3,4,5,6(可选)系统服务启动阶段root(默认)硬件驱动加载、网络服务、数据库守护进程
rc.local通常为2/3/5(取决于发行版)大多数服务启动后、登录前root设备挂载、时间同步、基础监控脚本
gnome-session-properties仅5用户登录成功后当前用户GUI通知、桌面小工具、个人工作流脚本

如何选择?记住三个原则:

  • 要早于登录?选rc.local/etc/init.d
  • 要严格控制启动顺序?选/etc/init.d+ 自定义优先级
  • 只需当前用户登录后运行?选gnome-session-properties

没有“最好”的方案,只有“最合适”的场景。

6. 常见问题与实战排错清单

即使严格按照步骤操作,仍可能遇到脚本不执行、报错或行为异常。以下是高频问题及对应解法:

6.1 “Permission denied” 权限错误

现象/etc/init.d/test-startup: 3: cd: Permission denied
原因:脚本中cd /home/Desktop/试图切换到普通用户目录,但init以root身份运行,无权访问用户家目录。
解法

  • 改用绝对路径执行命令(如ls /home/Desktop/);
  • 或在脚本开头添加chown -R user_name:user_name /home/Desktop/(不推荐);
  • 最佳实践:将脚本所需文件放在/opt//usr/local/bin/等系统路径。

6.2 脚本执行但无输出

现象:系统启动后看不到echo内容,日志也无记录
原因echo输出被重定向到/dev/null,或未写入日志文件
解法:在脚本中显式记录日志:

echo " $(date): test.sh started" >> /var/log/test-startup.log ls -l /home/Desktop/ >> /var/log/test-startup.log 2>&1

6.3 启动后脚本卡住系统

现象:系统长时间停留在紫色启动画面,无法进入登录界面
原因:脚本中存在阻塞操作(如sleep 300ping -c 10 google.com),且未加&后台运行
解法:所有长耗时命令后加&,并在rc.local中使用nohup

nohup /home/Desktop/test.sh > /dev/null 2>&1 &

6.4 Ubuntu 22.04+ 中 rc.local 不生效

原因:新版Ubuntu默认禁用rc-local.service
解法

sudo systemctl unmask rc-local sudo systemctl enable rc-local sudo systemctl start rc-local

获取更多AI镜像

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

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

媒体服务器元数据管理:MetaTube插件使用与优化完全指南

媒体服务器元数据管理:MetaTube插件使用与优化完全指南 【免费下载链接】jellyfin-plugin-metatube MetaTube Plugin for Jellyfin/Emby 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-metatube MetaTube是一款专为Jellyfin和Emby设计的媒体…

作者头像 李华
网站建设 2026/5/11 17:11:44

音乐小白必看:手把手教你用ccmusic-database识别16种音乐流派

音乐小白必看:手把手教你用ccmusic-database识别16种音乐流派 你有没有过这样的经历:听到一段旋律,心里直痒痒想问——这是什么风格?是交响乐还是独立流行?是灵魂乐还是软摇滚?可翻遍音乐平台标签&#xf…

作者头像 李华
网站建设 2026/5/23 8:20:27

中山大学LaTeX论文模板全攻略:从环境搭建到高效排版

中山大学LaTeX论文模板全攻略:从环境搭建到高效排版 【免费下载链接】sysu-thesis 中山大学 LaTeX 论文项目模板 项目地址: https://gitcode.com/gh_mirrors/sy/sysu-thesis 工具价值定位:为什么选择sysu-thesis模板 对于中山大学的毕业生而言&a…

作者头像 李华
网站建设 2026/5/9 5:05:09

PDFCompare文档比对工具深度应用指南

PDFCompare文档比对工具深度应用指南 【免费下载链接】pdfcompare A simple Java library to compare two PDF files 项目地址: https://gitcode.com/gh_mirrors/pd/pdfcompare 一、3大核心功能解析 1.1 智能视觉差异捕捉系统 业务痛点:传统文档比对工具常…

作者头像 李华