CentOS7 启动脚本还能用吗?

9 人参与

在 CentOS 7 环境里,很多管理员仍然习惯把自定义命令写进 /etc/rc.d/rc.local,但系统默认的启动框架已经切换到 systemd。实际上,rc.local 并未被彻底废除,只是需要手动赋予执行权限并启用 rc-local.service,否则它会在并行启动阶段被跳过。

rc.local 的现状

从技术文档来看,rc.local 仍保留在 /etc/rc.d/ 目录,仅作为兼容层存在。系统启动时,systemd 会读取 rc-local.service,该服务的 ExecStart 指向 rc.local。若文件缺少执行位(chmod +x /etc/rc.d/rc.local),服务直接报错并退出,导致后续脚本无声失效。

systemd 单元的兼容路径

  • 检查 rc-local.service 是否已启用:systemctl status rc-local.service
  • 若未启用,执行 systemctl enable rc-local.service 并重启验证。
  • 推荐做法是创建自定义的 .service 单元,将脚本逻辑迁移进去,避免依赖 rc.local。

实战迁移案例

某金融公司在生产环境中使用 rc.local 创建日志目录并写入启动标记。迁移步骤如下:

  • /etc/systemd/system/custom-start.service 中编写:
[Unit]
Description=Custom startup script
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/startup.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

随后将原 rc.local 中的 touch /var/log/startup.flag 移入 /usr/local/bin/startup.sh,并执行 systemctl daemon-reload && systemctl enable custom-start.service。重启后,日志文件如期生成,且启动时间比原 rc.local 提前约 3 秒。

常见误区

  • 误以为 rc.local 在所有系统版本中都自动可用,实际需要显式开启。
  • 把复杂的依赖关系写进 rc.local,导致并行启动时出现竞争条件。
  • 忽视 SELinux 策略,脚本在 rc.local 中可以执行,但在自定义 service 中若未标记为 execmem 会被拦截。

综上所述,rc.local 在 CentOS 7 仍能使用,但更稳妥的做法是把启动脚本封装为 systemd 服务单元,既符合现代化运维理念,又能在日志审计和权限控制上获得更细粒度的管理。

参与讨论

9 条评论
  • 小狗嘟嘟

    我把原来的rc.local迁移到自定义service后,启动更快了,省了不少调试时间,还避免了并行启动时的竞争问题,整体运维更顺畅。

  • 烛商邓

    别忘了给rc.local加执行位,chmod +x /etc/rc.d/rc.local,否则service会直接报错。

  • 鸽了

    rc-local.service默认是禁用状态吗?

  • 狂拽的土豆

    有人说rc.local不可靠,我用它来创建临时文件夹,配合systemd的ExecStartPre,运行稳定没有出现报错。

  • 剪影往事

    前几天把日志目录搬到systemd服务,结果启动时自动创建,省了手动改rc.local的麻烦。

  • 鲸鱼大大

    rc.local还能用,只是得手动开一下。

  • 马夫沈

    rc.local这玩意儿真是遗留的老古董。

  • 秘境探寻

    听说某公司迁移后启动时间提速3秒,大家都在讨论要不要也改 👍

  • 浓雾弥漫

    自定义service确实更稳妥,推荐大家都改一下。