首页/系统/信创系统运维速查/rc.local 开机脚本的正确启用
服务与运维65 条

rc.local 开机脚本的正确启用

老部署习惯把开机命令放 rc.local:现代发行版需要 rc-local.service 单元配合,脚本加执行位并 enable 后才会执行;关键业务建议改用正式 unit。

信创系统运维速查系统更新于 2026-10-13

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、再核对执行输出与退出码;多数情况卡在缺可执行位或单元未启用。

易错点

  • 脚本缺少可执行位,单元条件判断直接跳过且不报错,表现为「配置了但没生效」
  • 把长耗时任务放进 rc.local:同步执行会拖慢启动,甚至触发超时导致进入维护状态
  • 依赖顺序想当然,脚本执行时网络或存储尚未就绪,业务启动异常且难以复现
  • 关键业务长期挂在 rc.local 上,崩溃后无人拉起、日志也无处可查,故障恢复全靠人工

数据来源与参考

  • man 5 systemd-rc-local-generator
  • 红帽系统管理指南(rc.local 兼容)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌