系统级自启就这么配,简单又可靠
在实际运维和系统管理中,我们经常会遇到这样的需求:希望某个脚本或服务能够在系统重启后自动运行,无需人工干预。比如监控脚本、环境初始化任务、后台守护进程等。如果每次重启都要手动启动,不仅效率低,还容易遗漏。
本文将带你一步步配置一个系统级开机自启脚本,方法适用于主流的 Linux 发行版,包括 CentOS 和 Ubuntu。整个过程清晰、稳定、可验证,适合生产环境使用。
1. 准备你的启动脚本
首先,我们需要一个要自启的脚本文件。通常这类脚本会放在/etc/init.d/目录下,这是传统 SysVinit 系统的标准路径,至今仍被广泛支持。
假设我们要创建一个名为mytest.sh的测试脚本:
sudo vim /etc/init.d/mytest.sh写入以下内容作为示例:
#!/bin/bash # # mytest.sh 测试开机自启脚本 # description: 用于验证系统启动时是否成功执行 case "$1" in start) echo "【$(date)】测试脚本已启动,正在写入日志..." >> /var/log/mytest.log ;; stop) echo "【$(date)】测试脚本收到停止命令" >> /var/log/mytest.log ;; *) echo "用法: $0 {start|stop}" exit 1 ;; esac exit 0保存退出后,记得给脚本添加可执行权限:
sudo chmod +x /etc/init.d/mytest.sh同时,创建日志文件并设置权限(避免因无权限导致失败):
sudo touch /var/log/mytest.log sudo chmod 644 /var/log/mytest.log这个脚本很简单:当执行start参数时,会在日志中记录当前时间;stop则记录停止动作。你可以根据需要替换成自己的初始化逻辑。
2. 查看系统的运行级别
Linux 系统启动时会进入某个“运行级别”(runlevel),不同的级别对应不同的服务状态。现代系统虽然多用 systemd,但很多仍兼容 SysVinit 的 rc 脚本机制。
查看当前默认运行级别,可以使用命令:
runlevel输出可能类似:
N 5这里的5表示图形界面或多用户网络模式(带 GUI 的多用户模式)。如果你是在纯服务器上操作,可能是3(多用户文本模式)。
小知识:
- runlevel 3:命令行模式,支持网络
- runlevel 5:图形界面模式
/etc/rcX.d/中的 X 就是运行级别数字- 这些目录下的脚本链接自
/etc/init.d/
所以我们接下来要关注的是/etc/rc5.d/目录(以 runlevel 5 为例)。
3. 进入对应的 rc.d 启动目录
根据上一步查到的运行级别,进入相应的 rc 目录:
cd /etc/rc5.d/列出当前目录内容:
ls -l你会看到一堆以S或K开头的软链接,例如:
S01sysstat S10rsyslog S20network S99local这些代表在系统启动过程中按顺序执行的服务脚本。
命名规则说明:
S:Start,表示系统启动时执行K:Kill,表示关闭时执行(关机阶段)- 后面两位数字是执行顺序,范围从 00 到 99
- 数字越小,启动越早;越大则越晚
- 名称通常是服务名的缩写
如果你想让你的脚本较晚启动(比如依赖数据库或其他服务),建议选择较高的序号,如S99。
4. 为脚本创建软链接
为了让系统在启动时自动调用我们的脚本,需要在/etc/rc5.d/目录中创建一个指向/etc/init.d/mytest.sh的软链接。
执行以下命令:
sudo ln -s /etc/init.d/mytest.sh S99test这条命令做了三件事:
- 创建了一个名为
S99test的软链接 - 指向
/etc/init.d/mytest.sh - 命名规范符合启动脚本要求(S + 序号 + 名称)
再次查看目录内容:
ls -l S99*你应该能看到类似输出:
lrwxrwxrwx 1 root root 20 Apr 5 10:00 S99test -> /etc/init.d/mytest.sh这说明软链接已经正确建立。
提示:你也可以使用
update-rc.d(Ubuntu)或chkconfig(CentOS)工具来自动化管理这些链接,但直接创建软链接是最直观、最通用的方式,尤其适合一次性任务或调试场景。
5. 手动测试脚本是否可用
在重启之前,先手动测试一下脚本能否正常运行:
sudo /etc/init.d/mytest.sh start然后检查日志:
cat /var/log/mytest.log应该能看到类似内容:
【Sat Apr 5 10:05:12 CST 2025】测试脚本已启动,正在写入日志...这说明脚本本身没有问题,可以被正确调用。
6. 重启系统验证效果
现在进行最终验证:重启系统,看脚本是否自动执行。
sudo reboot系统重启完成后,重新登录,查看日志文件:
cat /var/log/mytest.log如果看到新的时间戳条目,说明脚本已在开机时自动运行!
例如:
【Sat Apr 5 10:05:12 CST 2025】测试脚本已启动,正在写入日志... 【Sat Apr 5 10:12:33 CST 2025】测试脚本已启动,正在写入日志...第二条就是重启后自动触发的结果。
7. 可选优化与注意事项
虽然上述方法简单有效,但在实际使用中还需注意以下几点:
设置脚本描述信息(增强兼容性)
有些系统会对/etc/init.d/脚本做语法检查。为了更规范,可以在脚本头部加入标准注释块:
#!/bin/bash # # chkconfig: 2345 99 01 # description: 测试开机自启脚本,用于验证系统启动流程 # processname: mytest.sh其中:
2345表示在哪些运行级别启用99是启动优先级01是停止优先级
CentOS 上可配合chkconfig --add mytest.sh使用,但本文方法不依赖此工具。
多运行级别适配
如果你不确定系统始终运行在 runlevel 5,可以为多个级别创建链接:
sudo ln -s /etc/init.d/mytest.sh /etc/rc3.d/S99test sudo ln -s /etc/init.d/mytest.sh /etc/rc5.d/S99test这样无论系统进入哪个常用模式都能触发。
避免阻塞系统启动
确保你的脚本是非阻塞的。如果脚本长时间不退出(比如一直循环监听),会导致系统卡在启动流程。
解决办法:让脚本快速启动后台进程后立即退出。例如:
start) if ! pgrep -f "my_daemon.py" > /dev/null; then nohup /usr/local/bin/my_daemon.py &>> /var/log/my_daemon.log & echo "守护进程已启动" else echo "守护进程已在运行" fi ;;权限与路径安全
- 脚本必须有执行权限:
chmod +x - 使用绝对路径调用程序
- 日志目录需提前存在且可写
8. 总结
通过本文的方法,你已经掌握了如何在 Linux 系统中配置一个稳定可靠的开机自启脚本。整个过程总结如下:
1. 编写脚本并放入/etc/init.d/
2. 给脚本添加可执行权限
3. 查看系统运行级别(runlevel)
4. 进入对应/etc/rcX.d/目录(如/etc/rc5.d/)
5. 创建以S开头的软链接(如S99test)
6. 重启系统验证效果
这种方法基于传统的 SysVinit 机制,在 CentOS 6/7、Ubuntu 16.04~20.04 等系统上均能良好工作,即使在部分使用 systemd 的系统中也因兼容层而有效。
它不需要复杂的 unit 文件编写,也不依赖特定发行版工具,是一种轻量、通用、易懂的系统级自启方案,特别适合嵌入式设备、老旧系统维护或快速部署场景。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。