在CentOS 7的现代化系统架构中,rc.local这个看似"古董级"的配置文件依然保持着独特的生命力。许多运维工程师初次接触时会惊讶地发现,这个从System V时代延续至今的启动脚本,在systemd成为主流的今天依然被保留在系统中。
打开/etc/rc.d/rc.local文件,开头的注释已经明确揭示了它的真实身份:"THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES"。这句话道破了rc.local在CentOS 7中的核心价值——作为传统init系统与现代systemd之间的过渡桥梁。当你在凌晨三点需要快速部署一个临时启动任务时,直接往rc.local里塞两行命令的便捷性,确实比编写完整的systemd服务单元文件要诱人得多。
不过这种便利性是有代价的。与早期版本不同,CentOS 7中的rc.local并非在启动过程的最后阶段执行。由于systemd的并行启动机制,这个脚本的运行时机会与其他服务同时进行。这就意味着,如果你指望用它来启动依赖网络服务的应用,很可能会遭遇"脚本执行时网络还没准备好"的尴尬局面。
最让人措手不及的是,CentOS 7默认提供的rc.local文件居然没有执行权限!多少运维人员信誓旦旦地配置完脚本后重启系统,却发现命令根本没执行,最后才发现需要手动运行chmod +x /etc/rc.d/rc.local。这个设计看似反直觉,实则是一种安全措施——防止未经审查的脚本意外执行。
对于那些需要创建标记文件或执行简单初始化任务的场景,rc.local确实提供了最快捷的解决方案。比如在系统启动时创建临时目录、设置特定的环境变量,或者像示例中那样用touch ~/test.txt创建测试文件。但官方注释也明确建议:对于复杂的启动任务,创建专门的systemd服务或udev规则才是正道。
在实际运维中,rc.local常常成为"快速修复"的代名词。上周就遇到个典型案例:某开发团队需要在所有测试服务器启动时挂载一个特定的NFS共享,时间紧迫之下直接在rc.local中添加了mount命令。虽然解决了眼前问题,但这种做法就像用透明胶带修补精密仪器——能应急,但绝非长久之计。
rc.local在CentOS 7生态系统中的存在,恰似传统与现代之间的缓冲带。它让老管理员感到亲切,让新入行者见识历史,更重要的是,在那些"just make it work"的紧急时刻,提供了一个简单直接的解决方案。
参与讨论
这个脚本在系统启动的哪个阶段执行?会不会在网络未就绪前跑?
rc.local 真的挺好用的,急时救命。
之前碰到权限没开,手动chmod +x后才跑。
如果要确保网络就绪,可以在rc.local里加sleep几秒,或者改写成systemd服务。
上次同事紧急挂NFS,直接往rc.local塞mount,系统马上启动成功,虽然有点乱,但真是救急神器👍,后面再改成service会更稳。
感觉还行。
这玩意儿真是坑,随时可能失效。
那如果想在rc.local里写条件判断,需要加#!/bin/bash吗?