解决/etc/rc.local重启时不执行

遇到的问题

最近在迁移服务器的过程中发现rc.local这个Linux开机启动程序并没有按照预期能够自动执行一些命令。
Linux

补充一些知识

我们得知道rc.local本质上是一个shell脚本文件,可以把启动时需要执行的命令写在里面,启动时将按顺序执行。

另外这里补充个知识:/etc/rc.local其实是/etc/rc.d/rc.local的软链接,我们执行ls -l /etc/rc.local就可以查看到:

1
>lrwxrwxrwx. 1 root root 13 1月  15 16:32 /etc/rc.local -> rc.d/rc.local

怎么解决这个问题

首先我们执行命令cat /etc/rc.local 查看该文件内部的信息会发现Linux官方它已经不推荐我们在使用了。【其实我老早知道了……】

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# cat /etc/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

上面的内容翻译出来的意思是:

1
2
3
4
5
6
7
#这个文件是为了兼容性的问题而添加的。
#
#强烈建议创建自己的systemd服务或udev规则来在开机时运行脚本而不是使用这个文件。
#
#与以前的版本引导时的并行执行相比较,这个脚本将不会在其他所有的服务后执行。
#
#请记住,你必须执行“chmod +x /etc/rc.d/rc.local”来确保确保这个脚本在引导时执行。

接着我们查看/etc/rc.local的权限:

1
2
3
4
[root@localhost ~]# ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 1月 15 16:32 /etc/rc.local -> rc.d/rc.local
[root@localhost ~]# ll /etc/rc.d/rc.local
-rw-r--r--. 1 root root 13 1月 29 10:45 /etc/rc.d/rc.local

此时我们会发现它没有执行权限,这里给它添加一下权限:

1
2
3
[root@localhost ~]# chmod +x /etc/rc.d/rc.local
[root@localhost ~]# ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 13 1月 29 10:45 /etc/rc.d/rc.local

最后我们执行一下重启服务命令:

1
2
3
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl list-dependencies multi-user.target | grep rc-local
● ├─rc-local.service

到此基本上解决了该问题,重启一下服务器证明一下它是否起效了。

最后我列一下命令,方便下次直接复制粘贴

1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 查看rc.local是否为+x 可执行文件
ls -lh /etc/rc.local

# 如果不是,则
chmod +x /etc/rc.local

# reload
systemctl daemon-reload

# list
systemctl list-dependencies multi-user.target | grep rc-local

> ● ├─rc-local.service

参考文章

如果对您有帮助,请小编喝一杯咖啡吧!