你还需要rc.local吗?
在本分步指南中,我们将学习如何创建传统文件。 rc.local 在常见的Linux发行版中,例如 Ubuntu, CentOS 和 AlmaLinux 启用并在启动时运行所需的脚本或命令。.
虽然 systemd 它已成为常见的默认初始化方式, rc.local 它仍然可用于在启动时快速便捷地执行简短脚本。以下是一些方法、示例、安全提示和现代替代方案。.
在 Ubuntu(18.04、20.04、22.04 及更高版本)中启用 rc.local
在新的Ubuntu版本中, systemd 可以按如下方式启用 rc.local。一般步骤包括创建文件、设置权限以及创建/启用 systemd 兼容性单元。.
一般步骤
- 创建文件 /etc/rc.local 然后添加所需的 shebang 和命令。.
- 授予文件可执行权限。.
- 在 systemd 中创建或启用 rc.local 单元(如果不存在)。.
- 正在加载、激活和检查服务状态。.
示例文件示例 /etc/rc.local (总是在最后) 出口 0 地方):
#!/bin/bash
# Example: start Docker container named myapp
docker start myapp || docker run -d --name myapp myimage
# simple sysctl
/sbin/sysctl -w net.ipv4.ip_forward=1
exit 0然后设置权限:
sudo chmod +x /etc/rc.local如果对应的单元不存在,则创建它:
sudo tee /etc/systemd/system/rc-local.service > /dev/null <<'EOF'
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF最后:
sudo systemctl daemon-reload
sudo systemctl enable rc-local.service
sudo systemctl start rc-local.service
sudo systemctl status rc-local.service
sudo journalctl -u rc-local.service -b
在 CentOS 7/8 和 AlmaLinux 8/9 上启用 rc.local
基于 RHEL 的发行版有不同的路径;传统路径通常是 /etc/rc.d/rc.local 总体步骤与 Ubuntu 类似,但请注意 SELinux 路径和注释。.
常用路线
- /etc/rc.d/rc.local 传统方法是在 RHEL/CentOS 系统上实现。.
- 在某些系统中,该链接可能 /etc/rc.local 存在。.
激活步骤(CentOS / AlmaLinux)
创建/编辑文件:
sudo nano /etc/rc.d/rc.local
#!/bin/bash
# Example: mount NFS or start a container
mount -a
/usr/bin/my-startup-script.sh &
exit 0行政许可证:
sudo chmod +x /etc/rc.d/rc.local如果单元不存在,则创建它:
sudo tee /etc/systemd/system/rc-local.service > /dev/null <<'EOF'
[Unit]
Description=/etc/rc.d/rc.local Compatibility
ConditionPathExists=/etc/rc.d/rc.local
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF进而:
sudo systemctl daemon-reload
sudo systemctl enable rc-local.service
sudo systemctl start rc-local.service
sudo systemctl status rc-local.service
sudo journalctl -u rc-local.service -bsudo restorecon -v /etc/rc.d/rc.local
# or temporarily change context
sudo chcon -t bin_t /etc/rc.d/rc.local在脚本中最好也使用绝对路径,例如: /usr/bin/docker 用于减少对 PATH 的依赖。.
实际案例和实用技巧
示例 — 运行 Docker 启动脚本
#!/bin/bash
# start redis container at boot
/usr/bin/docker run -d --name redis-cache --restart unless-stopped redis:6
exit 0笔记: 使用该选项 --除非停止,否则重新启动 使 Docker 能够处理容器回滚。.
示例 — 在运行服务之前进行网络挂载
如果脚本需要 NFS 挂载,请修改 systemd 单元以添加相应的依赖项:
[Unit]
After=network-online.target remote-fs.target
Wants=network-online.target remote-fs.target运行长时间脚本或永久服务——更好的方法
对于长时间运行或面向服务的任务,最好创建一个专用的 systemd 单元来使用重启和监控等功能:
sudo tee /etc/systemd/system/myjob.service > /dev/null <<'EOF'
[Unit]
Description=My Long Running Job
After=network-online.target
[Service]
Type=simple
User=myuser
ExecStart=/usr/local/bin/my-long-script.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOFsudo systemctl daemon-reload
sudo systemctl enable --now myjob.service
常见调试
- 服务处于故障状态: 从
sudo journalctl -u rc-local.service -b用于查看日志。. - 权限: 确保文件可执行(
chmod +x)而所有的一切,包括开头的部分。. - 相对路径: 二进制文件务必使用绝对路径。.
- 环境因素: rc.local 的环境有限;请显式定义 PATH 等变量或写入完整路径。.
- SELinux: 检查AVC错误并设置上下文。.
- 依赖关系: 如果脚本依赖于网络或文件系统,则单元应该是 之后= 和 需求= 应该合适。.
替代方案和最佳实践
- 专用 systemd 单元: 这是服务方面的最佳选择。.
- crontab @reboot: 适用于简单的用户任务:
@reboot /usr/local/bin/myscript.sh - cloud-init: 适用于云环境的初始配置。.
- 配置管理工具,例如 Ansible: 它用于进行可重复和可管理的更改。.
安全和操作提示
从执行敏感命令 rc.local 避免这样做。最好以特定所有权运行脚本,或者使用…… 用户= 用于 systemd。.
始终记录脚本输出,并使用有限的权限。例如:/usr/local/bin/myscript.sh >> /var/log/rc.local.log 2>&1
chmod 700 /usr/local/bin/myscript.sh对于生产环境,在将更改应用到关键服务器之前,请先在测试环境中进行测试。.
这项培训与公司服务的关系
我们公司在全球超过 85 个地点提供包括 VPS、云服务器、图形服务器 (GPU)、专用服务器和网络在内的服务,使您能够:
- 在交易或游戏VPS上快速运行启动脚本。.
- 在 GPU 服务器上,使用 systemd 单元启动占用资源较多的服务,以便在重启后处理能够正常启动。.
- 在网络和反 DDoS 服务器上,创建自定义 systemd 单元来运行网络脚本和 iptables。.
- 支持团队可提供 SELinux、挂载路径和依赖项方面的支持。.
结论和最终建议
尽管 systemd, rc.local 虽然这仍然是启动时运行自定义命令的简单方法,但为了稳定性和监控,最好使用 systemd 单元。.
始终注意权限、SELinux 和服务依赖关系,并使用日志进行调试。.
如果您有具体需求(例如,自动交易机器人执行、GPU环境准备或游戏服务器网络配置),我们的技术团队随时准备在各地为您提供帮助。.









