白银市网站建设_网站建设公司_Python_seo优化
2026/3/2 15:53:26 网站建设 项目流程

从0开始学Linux自启脚本,测试开机启动脚本超详细教程

1. 引言:为什么需要开机自启脚本?

在实际的服务器运维和嵌入式系统开发中,经常需要某些服务或脚本在系统启动时自动运行。例如,自动挂载磁盘、启动监控程序、初始化环境变量等。手动执行不仅效率低下,还容易遗漏。

本文将带你从零开始掌握Linux系统下如何配置开机自启动脚本,适用于CentOS和Ubuntu等主流发行版。通过本教程,你将学会:

  • 编写可执行的初始化脚本
  • 理解系统运行级别与启动流程
  • 正确创建软链接以实现开机自启
  • 验证并调试自启功能

无论你是初学者还是有一定经验的开发者,都能通过本指南快速上手并应用于实际项目。


2. 准备自启动脚本

2.1 创建脚本文件

我们将编写一个简单的测试脚本,用于验证开机是否成功执行。该脚本会记录当前时间到指定日志文件中。

sudo vim /etc/init.d/mytest.sh

输入以下内容:

#!/bin/bash # # mytest.sh - 测试开机自启脚本 # description: 记录系统启动时间到日志文件 case "$1" in start) echo "$(date): 系统已启动,执行 mytest.sh 脚本" >> /var/log/mytest.log ;; stop) echo "$(date): 系统正在关闭,执行停止操作" >> /var/log/mytest.log ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac exit 0

2.2 设置脚本权限

确保脚本具有可执行权限:

sudo chmod +x /etc/init.d/mytest.sh

注意/etc/init.d/是传统SysVinit系统的标准脚本存放目录,尽管现代系统多使用systemd,但该方式仍广泛兼容。


3. 查看系统运行级别

3.1 什么是运行级别(Runlevel)?

Linux系统根据“运行级别”决定启动哪些服务。不同级别对应不同的系统状态:

运行级别含义
0关机
1单用户模式(维护模式)
2-5多用户模式(具体含义因发行版而异)
6重启

3.2 查询当前运行级别

使用runlevel命令查看最后一次和当前的运行级别:

runlevel

输出示例:

N 5

其中N表示无前一状态,5表示当前运行级别为5。

在大多数桌面版Ubuntu/CentOS中,默认运行级别为5(带图形界面的多用户模式)。
对于无GUI的服务器,通常为3。

3.3 确定对应的rc目录

每个运行级别对应一个/etc/rcX.d/目录(X为数字),系统启动时会依次执行该目录下的脚本。

由于我们查得运行级别为5,因此应关注:

/etc/rc5.d/

4. 进入对应的rc.d目录并创建软链接

4.1 切换到目标目录

cd /etc/rc5.d/

该目录下包含大量以SK开头的符号链接,它们指向/etc/init.d/中的真实脚本。

4.2 理解S与K前缀的含义

前缀含义场景
SStart,系统启动时执行服务启动
KKill,系统关闭时执行服务停止

后接两位数字表示执行顺序,范围为00~99。数值越小,优先级越高。

例如:

  • S10network:网络服务较早启动
  • S99local:本地自定义脚本最后启动

4.3 为脚本创建软链接

为了确保我们的脚本在其他关键服务(如网络、文件系统)就绪后再运行,建议设置较高的序号,如99。

执行命令:

sudo ln -s /etc/init.d/mytest.sh S99mytest

参数说明

  • -s:创建符号链接(软链接)
  • 源路径:/etc/init.d/mytest.sh
  • 链接名:S99mytest,命名规范为S{两位数字}{脚本名}

4.4 验证软链接是否创建成功

ls -l S99mytest

输出应类似:

lrwxrwxrwx 1 root root 25 Apr 5 10:00 S99mytest -> /etc/init.d/mytest.sh

表示软链接已正确建立。


5. 测试开机自启动功能

5.1 手动模拟启动过程(可选)

在重启前,可以先手动测试脚本能否正常执行:

sudo /etc/init.d/mytest.sh start

检查日志文件是否生成:

cat /var/log/mytest.log

预期输出:

Mon Apr 5 10:05:00 CST 2025: 系统已启动,执行 mytest.sh 脚本

5.2 重启系统进行真实测试

使用以下命令重启:

sudo reboot

系统重新启动后,登录并查看日志:

cat /var/log/mytest.log

如果看到新的时间戳记录,说明脚本已在开机时自动执行!


6. 常见问题与解决方案

6.1 脚本未执行?排查要点

问题检查方法解决方案
权限不足ls -l /etc/init.d/mytest.sh使用chmod +x添加执行权限
软链接错误ls -l /etc/rc5.d/S99mytest确保链接指向正确的源文件
路径拼写错误readlink /etc/rc5.d/S99mytest修正源路径或重新创建链接
日志目录不存在ls /var/log/手动创建/var/log/mytest.log并赋权

6.2 如何支持多个运行级别?

若希望脚本在多个级别下都启动(如3和5),需为每个级别创建对应链接:

sudo ln -s /etc/init.d/mytest.sh /etc/rc3.d/S99mytest

6.3 删除自启配置

当不再需要自启时,删除软链接即可(不要删除原脚本):

sudo rm /etc/rc5.d/S99mytest

7. 最佳实践建议

7.1 脚本命名规范

  • 使用小写字母和下划线,避免空格或特殊字符
  • 名称应清晰表达用途,如backup_db.shmount_disks.sh

7.2 启动顺序规划

根据依赖关系合理设置序号:

序号区间推荐用途
01–20内核模块、设备驱动
21–50网络、存储、数据库
51–80应用服务
81–99自定义脚本、日志记录

7.3 添加系统服务管理支持(进阶)

虽然本文使用SysVinit方式,但在支持systemd的系统中,推荐将其封装为Unit文件以获得更好控制。

示例/etc/systemd/system/mytest.service

[Unit] Description=My Test Startup Script After=network.target [Service] ExecStart=/etc/init.d/mytest.sh start ExecStop=/etc/init.d/mytest.sh stop RemainAfterExit=yes [Install] WantedBy=multi-user.target

启用命令:

sudo systemctl enable mytest.service

8. 总结

通过本教程,你已经掌握了在Linux系统中配置开机自启动脚本的完整流程:

  1. 编写脚本:放置于/etc/init.d/并赋予执行权限
  2. 确认运行级别:使用runlevel命令获取当前级别
  3. 创建软链接:在/etc/rcX.d/中建立以S开头的链接
  4. 验证功能:重启系统并检查日志输出
  5. 优化管理:遵循最佳实践,提升稳定性和可维护性

这套方法适用于CentOS 6/7 和 Ubuntu 18.04/20.04 等仍保留SysVinit兼容层的系统,是运维工作中非常实用的基础技能。


获取更多AI镜像

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询