rc.local 开机脚本
/etc/rc.local 源自 SysV 时代,在现在的系统上由 rc-local.service 这个兼容单元负责执行。它写法简单、能放任意命令,至今仍是常见的持久化位置,同时也常被运维用来放自定义启动项,判断时要区分两者。
基本信息
| 文件 | /etc/rc.local、RHEL 系的 /etc/rc.d/rc.local |
|---|---|
| 执行方式 | 由 systemd 的 rc-local.service 单元拉起 |
| 权限要求 | 文件需要可执行权限,首行解释器要正确 |
| 单元状态 | systemctl status rc-local.service、systemctl is-enabled |
| 适用平台 | 多数主流 Linux 发行版 |
| 扩展目录 | 部分发行版提供 /run/rc.local.d 之类的补充目录 |
典型使用场景
- 排查开机自启的持久化脚本
- 确认业务自定义启动项是否仍在执行
- 检查单元已启用但脚本文件缺失的异常情况
- 分析重启后出现的未知进程来源
- 与 shell 启动文件、计划任务一起完成持久化面盘点
最小示例
最小示例
cat /etc/rc.local 2>/dev/null # 阅读脚本内容
ls -l /etc/rc.local /etc/rc.d/rc.local 2>/dev/null
systemctl status rc-local.service --no-pager | head -12
systemctl is-enabled rc-local.service
ps -ef | head # 结合运行中的进程定位来源
stat -c '%n mtime=%y ctime=%z' /etc/rc.local 2>/dev/null观察项与信号
| 观察项 | 含义 | 异常信号 |
|---|---|---|
| 文件内容 | 开机执行的命令 | 含下载、解码或重定向语句 |
| 可执行权限 | 是否会被实际执行 | 缺少执行位时脚本被跳过 |
| 单元状态 | 是否启用与运行结果 | 失败信息会出现在 status 输出中 |
| 首行解释器 | 决定用哪个 shell 解释 | 与实际语法不匹配会静默失败 |
| 文件时间戳 | mtime 与 ctime | 改动时刻与重启记录可对照 |
单元已启用但文件不存在,或文件存在却没有可执行权限,都会导致脚本被跳过;这两种情况都要在结论里说明。
新系统上部分发行版默认不再创建 /etc/rc.local,该文件出现本身就是值得追查的信号。
阅读脚本内容即可,不要为了验证而手动执行;脚本可能包含启动服务、下载文件等改变状态的命令。