文档首页/ 弹性云服务器 ECS/ 故障排除/ 操作系统类(Linux)/ CentOS 7中/etc/rc.local开机启动脚本不生效怎么办?
更新时间:2024-08-15 GMT+08:00

CentOS 7中/etc/rc.local开机启动脚本不生效怎么办?

问题现象

CentOS 7、EulerOS操作系统云服务器中,/etc/rc.local开机启动脚本不生效。

本节操作以CentOS 7操作系统为例分析根因,并介绍解决方法。

根因分析

出现该问题的可能原因如下:

  • CentOS 7中/etc/rc.d/rc.local文件没有执行权限。解决方案请参考处理方法1

    /etc/rc.local为/etc/rc.d/rc.local的软链接

  • /etc/rc.local配置路由重启不生效的场景,是由于添加路由依赖网络服务,而在CentOS 7系统启动过程中内核读取rc.local时网络服务尚未启动,导致添加路由失败。解决方案请参考处理方法2

处理方法1

针对/etc/rc.d/rc.local文件没有执行权限导致开机启动脚本执行失败的场景,解决方案如下。

CentOS7中该文件默认没有可执行权限

  1. 查看/etc/rc.d/rc.local是否有执行权限

    ls -l /etc/rc.d/rc.local

    -rw-r--r-- 1 root root 473 Sep 14 02:19 /etc/rc.d/rc.local

    如回显信息所示该文件没有执行权限,需要为/etc/rc.d/rc.local添加可执行权限。

  2. 执行以下命令为/etc/rc.d/rc.local添加可执行权限

    chmod +x /etc/rc.d/rc.local

处理方法2

针对/etc/rc.local配置路由重启不生效的场景,解决方案如下。

方法一:不使用/etc/rc.local配置路由,改为将路由写入静态路由配置文件(该方法即使重启网卡路由也不会丢失)。

  1. 在/etc/sysconfig/network-scripts/目录中创建或修改route-<interface>文件。
    该目录<interface>是与路由相关的接口的名称。
    <network/prefix> via <gateway>

    其中<network/prefix>是带有前缀的远程网络,<gateway>是下一跳的IP地址。

    例如,要添加一条通过192.168.100.10到10.20.30.0/24网络的路由,以便在eth0启用时都处于活动状态:

    cat /etc/sysconfig/network-scripts/route-eth0

    10.20.30.0/24 via 192.168.100.10  
  2. 执行以下命令,使修改生效。

    ifup eth0

方法二:/etc/rc.d/rc.local开机启动脚本由rc-local服务引导执行,可以修改在network-online.target后启动该服务。

  1. rc-local服务配置路径为/usr/lib/systemd/system/rc-local.service。

    执行以下命令,在[Unit]模块中添加或修改Requires和After项值为network-online.target。

    cat /usr/lib/systemd/system/rc-local.service |grep -v "^#"

    修改内容如下:

    [Unit]
    Description=/etc/rc.d/rc.local Compatibility
    ConditionFileIsExecutable=/etc/rc.d/rc.local
    Requires=network-online.target
    After=network-online.target
    
    [Service]
    Type=forking
    ExecStart=/etc/rc.d/rc.local start
    TimeoutSec=0
    RemainAfterExit=yes

    network-online.target是主动等待直到网络“启动”的target,其中“启动”的定义由网络管理软件定义。通常,它表示某种已配置的、可路由的IP地址。其主要目的是主动延迟服务的激活,直到建立网络为止。

  2. 执行以下命令,确认/etc/rc.d/rc.local有执行权限。

    ls -l /etc/rc.d/rc.local

    如果显示没有可执行权限,请参考处理方法1处理。

  3. 通知systemd重新加载配置文件。

    systemctl daemon-reload

  4. 重启rc-local.service,使/etc/rc.d/rc.local脚本立即生效。

    systemctl restart rc-local.service