news 2026/4/25 11:41:36

系统重启后服务自动拉起,我是这样配置的

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
系统重启后服务自动拉起,我是这样配置的

系统重启后服务自动拉起,我是这样配置的

在实际生产环境中,确保关键服务在系统重启后能够自动启动是运维工作的基本要求。本文将详细介绍如何通过传统的 SysVinit 机制实现服务的开机自启,适用于 CentOS 和 Ubuntu 等主流 Linux 发行版。我们将从脚本准备、运行级别分析到软链接创建,完整走一遍配置流程,并提供可落地的实践建议。

1. 准备自启动脚本

要实现服务开机自启,首先需要编写一个符合 init 脚本规范的 Shell 脚本。该脚本通常放置在/etc/init.d/目录下,这是传统 SysVinit 系统中存放服务启动脚本的标准路径。

1.1 编写基础启动脚本

以下是一个示例脚本mytest.sh,用于模拟一个后台服务的启动与停止:

#!/bin/bash # # mytest.sh 启动一个测试服务 # description: 测试开机启动功能的服务脚本 SERVICE_NAME="MyTestService" PID_FILE="/var/run/mytest.pid" LOG_FILE="/var/log/mytest.log" case "$1" in start) echo "Starting $SERVICE_NAME..." if [ -f $PID_FILE ]; then echo "$SERVICE_NAME is already running." exit 1 fi # 模拟后台进程 nohup sh -c 'while true; do echo "$(date): Heartbeat" >> /tmp/mytest.log; sleep 10; done' & echo $! > $PID_FILE echo "$SERVICE_NAME started." ;; stop) echo "Stopping $SERVICE_NAME..." if [ ! -f $PID_FILE ]; then echo "$SERVICE_NAME is not running." exit 1 fi kill $(cat $PID_FILE) > /dev/null 2>&1 rm -f $PID_FILE echo "$SERVICE_NAME stopped." ;; restart) $0 stop $0 start ;; status) if [ -f $PID_FILE ]; then if kill -0 $(cat $PID_FILE) > /dev/null 2>&1; then echo "$SERVICE_NAME is running with PID $(cat $PID_FILE)" else echo "$SERVICE_NAME is not running (stale PID file)" rm -f $PID_FILE fi else echo "$SERVICE_NAME is not running" fi ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 ;; esac exit 0

1.2 设置脚本权限并注册为服务

将脚本保存为/etc/init.d/mytest.sh,然后赋予可执行权限:

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

此时即可手动测试脚本是否正常工作:

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

2. 查看系统运行级别

Linux 系统使用“运行级别”(Runlevel)来定义不同的系统状态。SysVinit 根据当前运行级别决定加载哪些服务。

2.1 使用 runlevel 命令查看当前级别

执行以下命令查看最后一次和当前的运行级别:

runlevel

输出示例如下:

N 5

其中: -N表示之前无运行级别(即刚开机) -5表示当前运行级别为 5

常见运行级别含义如下:

运行级别说明
0关机
1单用户模式
2多用户模式(无网络)
3多用户模式(命令行)
4用户自定义
5多用户模式 + 图形界面
6重启

大多数服务器环境默认运行在级别 3 或 5。

3. 理解 rc.d 目录结构

SysVinit 在系统启动时会根据运行级别进入对应的/etc/rcX.d/目录(X 为运行级别),并按顺序执行其中的脚本链接。

3.1 目录作用说明

  • /etc/init.d/:存放所有服务的实际启动脚本。
  • /etc/rcX.d/:每个运行级别对应的脚本链接目录,内容为指向/etc/init.d/的软链接。

3.2 链接命名规则

rcX.d 目录中的文件名遵循特定格式:[S/K][0-9][0-9][service_name]

前缀含义
SStart,在系统启动时执行
KKill,在系统关闭时执行
数字执行顺序(00~99),数值越小越早执行

例如: -S80apache2:在启动时第 80 顺位启动 Apache 服务 -K20mysql:在关机时第 20 顺位停止 MySQL 服务

4. 创建软链接实现开机自启

确定运行级别后,需在对应 rc 目录中创建指向/etc/init.d/mytest.sh的软链接。

4.1 进入目标 rc 目录

假设当前运行级别为 5,则进入:

cd /etc/rc5.d/

注意:若系统使用 systemd(如较新版本的 Ubuntu/CentOS),此方法仍兼容,但推荐使用systemctl enable替代。

4.2 创建启动软链接

使用ln命令创建以S开头的软链接,表示开机启动:

sudo ln -s /etc/init.d/mytest.sh S99mytest
参数解释:
  • /etc/init.d/mytest.sh:源脚本路径
  • S99mytest:软链接名称
  • S:表示启动时执行
  • 99:执行顺序编号,设为较大值以确保依赖服务(如数据库、网络)已就绪
  • mytest:服务名称标识

4.3 验证软链接是否生效

列出目录内容确认链接存在:

ls -l /etc/rc5.d/S99mytest

预期输出:

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

5. 测试与验证

完成配置后,通过重启系统验证服务是否能自动拉起。

5.1 重启系统

sudo reboot

5.2 登录后检查服务状态

系统重启后,立即检查服务运行情况:

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

如果看到类似输出:

MyTestService is running with PID 1234

说明服务已成功自动启动。

5.3 查看日志确认行为

检查我们脚本写入的日志文件:

tail /tmp/mytest.log

应能看到周期性的心跳记录,证明后台进程持续运行。

6. 实践优化与注意事项

虽然上述方法在多数场景下有效,但在实际工程中还需注意以下几点。

6.1 合理设置启动顺序

若服务依赖数据库、Redis 或其他中间件,应将其启动序号设置为较高值(如 90 以上),确保依赖项已准备就绪。

示例:

# 推荐做法:晚于大多数服务启动 sudo ln -s /etc/init.d/mytest.sh S95mytest

6.2 兼容现代系统(systemd)

对于使用systemd的系统(CentOS 7+、Ubuntu 16.04+),更推荐使用systemctl方式管理服务。

创建 unit 文件:
# /etc/systemd/system/mytest.service [Unit] Description=My Test Service After=network.target [Service] ExecStart=/etc/init.d/mytest.sh start ExecStop=/etc/init.d/mytest.sh stop Restart=always Type=forking PIDFile=/var/run/mytest.pid [Install] WantedBy=multi-user.target
启用开机自启:
sudo systemctl daemon-reexec sudo systemctl enable mytest.service sudo systemctl start mytest.service

这种方式更加标准化,支持依赖管理、自动重启、日志集成等高级特性。

6.3 安全性建议

  • 最小权限原则:避免以 root 身份长期运行服务,可在脚本中切换用户。
  • 日志轮转:使用logrotate管理日志文件,防止磁盘占满。
  • 异常恢复:考虑加入监控脚本或配合cron定期检查进程状态。

7. 总结

本文详细介绍了如何通过 SysVinit 机制实现 Linux 系统中服务的开机自启,涵盖脚本编写、运行级别识别、rc.d 软链接创建及验证全流程。核心要点包括:

  1. 脚本规范/etc/init.d/下的脚本需支持startstopstatus等标准操作;
  2. 运行级别匹配:根据runlevel输出选择正确的/etc/rcX.d/目录;
  3. 软链接命名:使用S[0-9][0-9][name]格式创建启动链接,数字越大启动越晚;
  4. 顺序控制:关键服务应设置较高序号,确保依赖服务已启动;
  5. 现代替代方案:在支持systemd的系统上,优先使用systemctl enable实现更可靠的管理。

尽管 SysVinit 正逐步被 systemd 取代,但在许多遗留系统或嵌入式环境中仍广泛使用。掌握这一机制有助于应对多样化的部署场景,提升系统的稳定性和自动化能力。


获取更多AI镜像

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

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

如何用fft npainting lama做干净的背景替换?实测分享

如何用fft npainting lama做干净的背景替换?实测分享 1. 背景与需求分析 在图像处理和内容创作领域,背景替换是一项高频且关键的任务。无论是电商产品图去底、人像摄影后期,还是广告设计中的场景合成,都需要一种高效、精准且自然…

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

开源语音模型哪家强?SenseVoiceSmall多场景落地实操手册

开源语音模型哪家强?SenseVoiceSmall多场景落地实操手册 1. 引言:多语言富文本语音理解的新范式 随着智能语音交互在客服、教育、内容审核等场景的广泛应用,传统“语音转文字”已无法满足复杂业务需求。用户不仅希望获取准确的文字内容&…

作者头像 李华
网站建设 2026/4/17 19:40:52

YOLOv8技术进阶:注意力机制集成方法

YOLOv8技术进阶:注意力机制集成方法 1. 引言:YOLOv8在工业级目标检测中的挑战与机遇 随着智能制造、智能安防和自动化巡检等场景的快速发展,对实时目标检测系统提出了更高要求。尽管 Ultralytics YOLOv8 已经凭借其卓越的速度-精度平衡成为…

作者头像 李华
网站建设 2026/4/18 21:37:26

NotaGen镜像深度体验|高效生成高质量符号化古典乐

NotaGen镜像深度体验|高效生成高质量符号化古典乐 在AI音乐生成领域,大多数工具仍停留在音频波形合成或简单旋律生成的层面,难以满足专业作曲与乐谱创作的需求。而NotaGen的出现,标志着基于大语言模型(LLM&#xff09…

作者头像 李华
网站建设 2026/4/25 11:35:55

买不起显卡怎么学AI?bert-base-chinese云端实验室免费试用

买不起显卡怎么学AI?bert-base-chinese云端实验室免费试用 你是不是也遇到过这样的情况:作为二本院校的学生,想参加一场NLP(自然语言处理)竞赛,队友们都在用GPU云平台快速训练模型、调参优化,而…

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

verl性能瓶颈诊断:5步快速定位系统短板

verl性能瓶颈诊断:5步快速定位系统短板 1. 引言 随着大型语言模型(LLMs)在自然语言处理领域的广泛应用,强化学习(RL)作为后训练阶段的关键技术,其训练效率和系统稳定性直接影响模型迭代速度与…

作者头像 李华