rc.local 是做什么的
rc.local 是 SysV 时代遗留的开机脚本入口,许多老系统与国产发行版的部署脚本仍习惯把启动命令写在这里。在现代 systemd 系统(麒麟、UOS、openEuler)上,它由 rc-local.service 这个兼容单元承载:脚本必须带可执行位,且单元被 enable 后才会在开机时执行。它的定位应是兼容存量脚本与一次性环境准备,而不是承载关键业务。
基本信息
| 脚本路径 | RPM 系约定 /etc/rc.d/rc.local,deb 系常见 /etc/rc.local |
|---|---|
| 承载单元 | rc-local.service(systemd 生成器按脚本存在性创建) |
| 执行时机 | 多用户目标阶段,同步顺序执行,不重试 |
| 必要权限 | root 编辑脚本,脚本本身需可执行位 |
| 日志 | 需自行重定向,否则输出进入启动过程日志 |
典型使用场景
- 迁移存量系统时保留原有的开机初始化行为,减少一次性改造工作量
- 做一次性的环境准备:把内存参数、内核接口或目录权限设置成开机即生效
- 启动不在 systemd 管理范围内的遗留程序(有独立脚本、无服务单元的老软件)
- 排障时临时插入调试命令,观察开机阶段的执行结果
- 交付过渡期兜底:先让环境跑起来,再逐步把关键服务改造成正式单元
- 验证网络与存储就绪情况,确认脚本执行时依赖的资源是否已经可用
配置流程
配置流程
# 写入启动脚本内容(RPM 系约定路径)
cat > /etc/rc.d/rc.local <<'EOF'
#!/bin/bash
/opt/scripts/prepare-env.sh >> /var/log/rc-local.log 2>&1 # 显式重定向日志
EOF
chmod +x /etc/rc.d/rc.local # 缺可执行位单元会静默跳过
systemctl enable --now rc-local.service # 启用并立即执行一次
systemctl status rc-local --no-pager # 查看执行结果与退出码
tail -20 /var/log/rc-local.log # 核对脚本自身输出单元配置要点
| 配置项 | 作用 | 推荐做法 |
|---|---|---|
| ExecStart | 执行 rc.local 脚本 | 由生成器产生,一般不手工改 |
| RemainAfterExit | 脚本退出后单元仍视为激活 | yes,便于系统状态判断 |
| After | 声明启动顺序依赖 | 涉及网络存储时显式添加等待 |
| Restart | 失败是否重启 | rc.local 同步执行不适用,关键业务改正式单元 |
| StandardOutput | 输出去向 | 脚本内自行重定向到日志文件 |
rc.local 同步执行、无重试机制也没有统一日志:关键业务应写成正式 systemd 单元,用 Restart 与 After 表达守护与依赖关系,rc.local 只留给兼容与一次性准备。
排查「脚本没执行」时分三步:确认脚本存在且可执行、确认 rc-local.service 已 enable、再核对执行输出与退出码;多数情况卡在缺可执行位或单元未启用。