rc.local开机脚本不生效
约 547 字大约 2 分钟
2026-08-29
想开机自动执行脚本,写进 /etc/rc.local 却没跑?这是 systemd 时代最常见的坑:rc.local 现在只是一个兼容服务,文件没执行权限、服务没启用、脚本环境与登录 shell 不同,都会导致"不生效"。按本文顺序排查,最后附更现代的替代方案。
第一步:检查文件格式与执行权限
head -1 /etc/rc.local # 第一行必须是 #!/bin/bash(或 #!/bin/sh)
tail -1 /etc/rc.local # 最后一行建议是 exit 0
ls -l /etc/rc.local # 必须有可执行权限(x)没有执行权限是头号原因:
sudo chmod +x /etc/rc.localCentOS / Rocky
/etc/rc.local 是指向 /etc/rc.d/rc.local 的软链接,对 /etc/rc.local 执行 chmod +x 即可作用于真实文件。
第二步:确认 rc-local 服务已启用
systemctl status rc-local显示 inactive / dead 时启用它:
sudo systemctl enable --now rc-local提示 unit 不存在?
个别精简系统没有自带 rc-local.service,可手动创建 /etc/systemd/system/rc-local.service:
[Unit]
Description=/etc/rc.local Compatibility
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now rc-local第三步:手动执行脚本,找真实报错
开机没跑的脚本,手动执行往往立刻现形:
sudo bash -x /etc/rc.localrc.local 里最容易踩的环境差异:
PATH 与登录 shell 不同:命令一律写绝对路径(如
/usr/bin/systemctl、/usr/local/bin/app)。没有输出、无从排查:给命令加日志重定向,开机后看
/var/log/rc.local.log:/path/to/script.sh >> /var/log/rc.local.log 2>&1执行身份是 root:脚本内不需要再写
sudo。
第四步:脚本依赖网络,但执行时网络未就绪
rc-local 启动时网络可能还没配好,依赖网络(拉取文件、启动 Web 服务等)的脚本会失败。脚本开头加等待:
until ping -c1 -W2 223.5.5.5 &>/dev/null; do sleep 2; done更现代的替代方案
systemd 服务(推荐),可精确控制启动时机:
# /etc/systemd/system/myapp.service
[Unit]
Description=My App
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/myapp.sh
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now myappcrontab @reboot,一行搞定,与定时任务同源:
@reboot /path/to/script.sh >> /var/log/reboot.log 2>&1定时任务完整用法见Cron定时任务。
