news 2026/2/28 17:35:10

自动化第一步:用测试脚本实现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/2/25 18:32:54

verl超参数调优:网格搜索与贝叶斯优化对比

verl超参数调优:网格搜索与贝叶斯优化对比 1. 技术背景与选型挑战 在大型语言模型(LLMs)的后训练阶段,强化学习(Reinforcement Learning, RL)已成为提升模型行为对齐能力的关键手段。随着 verl 框架的开源…

作者头像 李华
网站建设 2026/2/26 5:45:24

从本地到云端:GLM-4.6V-Flash-WEB迁移部署完整指南

从本地到云端:GLM-4.6V-Flash-WEB迁移部署完整指南 你是不是已经在家里的开发机上跑通了 GLM-4.6V-Flash-WEB,测试了几张图片、问了几个问题,效果还不错?但现在想把它搬到线上,变成一个稳定对外服务的 API&#xff0c…

作者头像 李华
网站建设 2026/2/25 6:44:56

Keil uVision5使用教程:优化选项与内存布局设置指南

Keil uVision5实战精要:编译优化与内存布局的深度掌控 你有没有遇到过这样的情况? 调试时一切正常,一换到发布版本,程序却莫名其妙跑飞;或者OTA升级失败,只因为固件大了2KB;又或者实时控制环路…

作者头像 李华
网站建设 2026/2/27 13:38:33

数字人创业第一步:HeyGem云端测试成本控制指南

数字人创业第一步:HeyGem云端测试成本控制指南 你是不是也有一个数字人创业的想法,却卡在了“第一步”?想验证市场反应,又怕投入太多硬件成本打水漂?别担心,这正是我们今天要解决的问题。 HeyGem.ai 是一…

作者头像 李华
网站建设 2026/2/27 10:49:31

DeepSeek-OCR技术揭秘:低光照图像增强技术

DeepSeek-OCR技术揭秘:低光照图像增强技术 1. 技术背景与问题提出 在实际的光学字符识别(OCR)应用场景中,图像质量往往成为制约识别准确率的关键因素。尤其是在低光照、高噪声、背光不均等复杂成像条件下,原始图像常…

作者头像 李华