/etc/rc.local在ubuntu 20.04/22.04等现代linux中默认不启用,需手动创建可执行文件并启用systemd的rc-local.service服务;脚本须用绝对路径、显式设置环境,并避免阻塞,复杂场景推荐使用原生systemd服务单元。

在现代 Linux(如 Ubuntu 20.04/22.04、Debian 11+)中,/etc/rc.local 不再默认启用——它没被删除,只是 systemd 不再主动执行。要让它真正工作,得手动“唤醒”这个传统机制。核心就两件事:让 rc.local 文件本身可执行,再让 systemd 认可并管理它。
确保 /etc/rc.local 存在且可执行
如果文件不存在,先创建:
- 运行
sudo nano /etc/rc.local(或用 vim) - 写入标准 shell 头和占位内容(注意必须有
#!/bin/bash或#!/bin/sh):
#!/bin/bash # 在 exit 0 前添加你的命令,例如: # /home/user/myscript.sh >> /var/log/myscript.log 2>&1 exit 0
- 保存后立即赋权:
sudo chmod +x /etc/rc.local - 权限不对是开机不执行的最常见原因,别跳过这步
启用 systemd 的 rc-local.service
systemd 需要一个明确的服务定义来调用 rc.local。检查是否已有该服务:
- 运行
systemctl list-unit-files | grep rc-local - 若无输出或显示
disabled,说明需手动创建服务单元
创建服务文件:sudo nano /etc/systemd/system/rc-local.service,填入以下内容:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
[Unit] Description=/etc/rc.local Compatibility After=network.target <p>[Service] Type=oneshot ExecStart=/etc/rc.local TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes</p><p>[Install] WantedBy=multi-user.target</p>
- 保存后重载 systemd 配置:
sudo systemctl daemon-reload - 启用服务:
sudo systemctl enable rc-local - 启动一次验证:
sudo systemctl start rc-local
调试与常见避坑点
脚本没运行?别急着重装系统,先看日志:
- 查服务状态:
sudo systemctl status rc-local - 看详细日志:
sudo journalctl -u rc-local -n 50 --no-pager
高频问题包括:
-
路径错误:脚本里用相对路径(如
./start.sh)会失败,一律写绝对路径(/home/user/start.sh) -
环境缺失:rc.local 运行时没有用户环境变量(PATH、HOME 等),建议在脚本开头显式设置,或用完整路径调用命令(如
/usr/bin/python3) -
后台进程未分离:直接运行
python3 app.py会阻塞,加&并配合nohup,例如:nohup /usr/bin/python3 /opt/myapp.py > /var/log/myapp.log 2>&1 &
替代方案提醒:什么情况下该换方式?
rc.local 适合简单、顺序执行的初始化任务(挂载、启动单个服务、写日志)。但如果你需要:
- 程序崩溃后自动重启
- 精确控制启动顺序(比如必须等数据库就绪)
- 以非 root 用户身份运行
- 管理多个相互依赖的服务
那就该用原生 systemd service 文件了——虽然配置稍多,但更健壮、可控、符合现代规范。










