news 2026/4/3 2:45:17

自动化第一步:用测试脚本实现Linux开机自启

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
自动化第一步:用测试脚本实现Linux开机自启

自动化第一步:用测试脚本实现Linux开机自启

1. 引言

在Linux系统运维和自动化部署中,让自定义脚本随系统启动自动运行是一项基础但关键的能力。无论是启动服务、初始化环境变量,还是执行健康检查,通过配置开机自启脚本都能显著提升系统的自动化水平。

本文将详细介绍如何在主流Linux发行版(如CentOS和Ubuntu)中,通过传统的SysVinit机制实现脚本的开机自启动。我们将从脚本编写、运行级别分析到软链接创建,一步步完成整个流程,并提供可验证的实践步骤。

该方法适用于未全面切换至systemd的旧系统或特定嵌入式场景,具有良好的兼容性和稳定性。

2. 理解Linux启动流程与运行级别

2.1 SysVinit 启动机制概述

Linux系统早期采用SysVinit作为默认的初始化系统。其核心逻辑是通过一系列“运行级别”(Runlevel)来控制服务的启动状态。每个运行级别对应一组预设的服务集合。

常见的运行级别包括:

运行级别说明
0关机
1单用户模式(维护模式)
2-5多用户模式(不同图形/网络支持)
6重启

通常,桌面环境使用 runlevel 5,而服务器多使用 runlevel 3。

2.2 目录结构解析

SysVinit 的服务管理依赖两个核心目录:

  • /etc/init.d/:存放所有可执行的启动脚本。
  • /etc/rcX.d/:X代表运行级别,该目录下包含指向/etc/init.d/脚本的符号链接。

这些符号链接命名规则如下:

  • Sxxname:以S开头表示 Start,在系统启动时执行。
  • Kxxname:以K开头表示 Kill,在系统关闭时执行。
  • xx是两位数字(00-99),决定执行顺序,数值越小越早执行。

例如:S80network表示在网络相关服务中较早启动。

3. 编写并准备启动脚本

3.1 创建测试脚本

我们将在/etc/init.d/下创建一个简单的测试脚本mytest.sh,用于验证开机自启功能。

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

输入以下内容:

#!/bin/bash # # mytest.sh - A simple test script for boot automation # chkconfig: 2345 99 01 # description: Test script to verify auto-start on boot case "$1" in start) echo "$(date): Starting My Test Script..." >> /var/log/mytest.log ;; stop) echo "$(date): Stopping My Test Script..." >> /var/log/mytest.log ;; restart) $0 stop $0 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac exit 0

3.2 设置权限与可执行性

保存后,赋予脚本可执行权限:

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

注意:脚本首行的#!/bin/bash指定解释器;chkconfig注释行用于某些工具识别启动优先级(尽管现代系统可能不再依赖它)。

4. 查看当前系统运行级别

4.1 使用 runlevel 命令

执行以下命令查看当前系统的运行级别:

runlevel

输出示例:

N 5

其中N表示之前无状态,5表示当前处于运行级别5。

如果你看到的是3,则应使用/etc/rc3.d/目录进行后续操作。

4.2 获取默认目标运行级别

你也可以通过以下方式确认系统默认进入的运行级别:

who -r

或查看/etc/inittab文件(如果存在)中的id:字段。

5. 创建符号链接以注册启动项

5.1 进入对应的 rc.d 目录

根据上一步获取的运行级别,进入相应的rcX.d目录。假设结果为5

cd /etc/rc5.d/

5.2 创建符号链接

使用ln命令创建指向/etc/init.d/mytest.sh的软链接:

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

命名建议: - 使用S99确保脚本在大多数服务之后启动,适合有依赖(如数据库、网络)的进程。 - 若需更早启动,可设为S20或更低。

5.3 验证链接是否成功

列出目录内容确认链接已建立:

ls -l /etc/rc5.d/S99mytest

预期输出:

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

6. 测试脚本的启动与停止行为

6.1 手动触发启动

你可以不重启系统,直接测试脚本是否能正常运行:

sudo /etc/rc5.d/S99mytest start

检查日志文件是否生成记录:

cat /var/log/mytest.log

输出应类似:

Fri Apr 5 10:05:23 UTC 2024: Starting My Test Script...

6.2 手动停止服务

同样可以手动停止:

sudo /etc/rc5.d/S99mytest stop

再次查看日志,确认停止时间也被记录。

7. 重启系统验证自启效果

7.1 执行重启命令

完成上述配置后,重启系统以验证开机自启是否生效:

sudo reboot

7.2 登录后验证日志

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

cat /var/log/mytest.log

你应该能看到至少两条记录: - 上次手动启动的时间 - 最近一次系统启动时自动生成的“Starting”条目

这表明脚本已在开机过程中被自动调用。

8. 可选优化与最佳实践

8.1 添加 chkconfig 支持(适用于 CentOS/RHEL)

若在基于 Red Hat 的系统中使用,建议添加完整头部注释以便chkconfig工具识别:

# chkconfig: 2345 99 01 # description: Test script to verify auto-start on boot # processname: mytest.sh

然后使用chkconfig注册服务:

sudo chkconfig --add mytest.sh sudo chkconfig mytest.sh on

8.2 替代方案:使用 systemd(推荐新项目)

虽然本文聚焦于传统 init 系统,但在现代 Linux 发行版中,systemd已成为标准。对于新项目,建议使用.service文件替代 init.d 脚本。

示例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 cp mytest.service /etc/systemd/system/ sudo systemctl daemon-reexec sudo systemctl enable mytest.service

8.3 安全与权限建议

  • 日志路径/var/log/mytest.log应确保脚本能写入:bash sudo touch /var/log/mytest.log sudo chown root:root /var/log/mytest.log sudo chmod 644 /var/log/mytest.log
  • 避免在脚本中硬编码敏感信息。
  • 使用最小权限原则运行脚本,必要时配合sudo规则限制。

9. 故障排查常见问题

9.1 脚本未执行

可能原因: - 符号链接未正确创建或路径错误 - 脚本缺少可执行权限 - 运行级别不匹配(误用了 rc3.d 而实际是 runlevel 5)

排查方法: - 检查/etc/rcX.d/中是否存在Sxxname链接 - 手动执行脚本看是否有报错 - 查看系统日志:journalctl -btail /var/log/messages

9.2 日志无输出

  • 检查/var/log/mytest.log是否可写
  • 确认脚本中重定向路径正确
  • SELinux 或 AppArmor 可能阻止写入(可通过setenforce 0临时关闭测试)

9.3 启动顺序问题

若脚本依赖其他服务(如MySQL、Redis),但启动过早导致失败:

  • 将序号改为更高值(如S95,S99
  • 在脚本内部加入等待逻辑:bash sleep 10 # 等待关键服务就绪

获取更多AI镜像

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

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

拖拽式大模型应用开发指南

1.可拖拽创建大模型应用的框架有什么 目前支持可拖拽创建大模型应用的框架或平台,主要面向低代码/无代码(Low-code/No-code)开发场景,旨在让开发者、产品经理甚至非技术人员也能通过可视化界面快速构建基于大语言模型&#xff08…

作者头像 李华
网站建设 2026/4/2 22:28:31

图片旋转判断从入门到精通:基于云端GPU的完整学习路径

图片旋转判断从入门到精通:基于云端GPU的完整学习路径 你是不是也遇到过这样的情况?拍了一张很有感觉的照片,结果一看是歪的;或者扫描了一份文档,发现角度偏了,看着特别别扭。以前我们可能只会用手机自带的…

作者头像 李华
网站建设 2026/3/16 7:51:45

django基于python的酒店预定管理系统 客房清洁

目录 Django酒店预订管理系统中的客房清洁模块设计 关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! Django酒店预订管理系统中的客房清洁模块设计 Django框架构建的酒店预订管理系…

作者头像 李华
网站建设 2026/3/26 2:50:19

学霸同款2026 TOP8 AI论文软件:本科生毕业论文必备测评

学霸同款2026 TOP8 AI论文软件:本科生毕业论文必备测评 2026年学术写作工具测评:为何需要一份精准榜单? 随着AI技术在学术领域的深入应用,越来越多的本科生开始依赖AI工具辅助论文写作。然而,面对市场上琳琅满目的AI论…

作者头像 李华
网站建设 2026/3/25 14:48:09

软件打开提示找不到d3dx9_30.dll文件 如何修复? 附免费下载方法

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华