rc.local文件开机不执行

本文解决了一个CentOS 7.9系统中rc.local文件无法执行开机自启动脚本的问题,并深入探讨了软链接及其指向文件的权限、属主及属组的变化规律。

前言

环境:Centos7.9

rc.local文件开机不执行

前些天在做Linux项目的时候发现,需要有些组件开机自启动,所有把脚本放到了 /etc/rc.local 下,同时也查看了rc.local 文件的权限,如下:

[oracle@master etc]$ ll /etc/rc.local 
lrwxrwxrwx. 1 root root 13 Jul 16 16:23 /etc/rc.local -> rc.d/rc.local

rc.local 文件已经有可执行权限,可是centos重启开机后,自己写得脚本却没有执行,这就纳闷了,于是把自己写的脚本单独拿出来在命令行执行,也会执行成功的,那么为什么centos重启后,自己写得脚本却没有执行,难道是/etc/rc.local 没有执行吗?不可能啊,rc.local 就是放开机自启动软件的脚本呀,也有可执行权限呀,怎么回事?

找到原因了

原来,挖槽,/etc/rc.local 执向的实际文件/etc/rc.d/rc.local 没有可执行权限,如下:

[oracle@master etc]$ ll /etc/rc.d/rc.local 
-rw-------. 1 root root 543 Jul 16 17:40 /etc/rc.d/rc.local

[oracle@master etc]$  chmod a+rx  /etc/rc.d/rc.local

于是给/etc/rc.d/rc.local赋予可执行权限,重启Centos,自己写得脚本执行正常。

为什么软连接的权限和实际执行的文件权限不同

于是,为了验证软链接的权限和实际执行的文件权限,为什么不同,故意进行测试,如下:

[oracle@master ~]$ touch file
[oracle@master ~]$ ln -s file lsfile
[oracle@master ~]$ ll file lsfile
-rw-r--r-- 1 oracle oinstall 0 Jul 17 23:40 file
lrwxrwxrwx 1 oracle oinstall 4 Jul 17 23:40 lsfile -> file

发现,系统默认创建的软链接权限是777,而软链接实际执行的文件却没有可执行权限,现在我们来改变软链接的权限看看,如下:

[oracle@master ~]$ chmod  000  lsfile 
[oracle@master ~]$ ll file lsfile
---------- 1 oracle oinstall 0 Jul 17 23:40 file
lrwxrwxrwx 1 oracle oinstall 4 Jul 17 23:40 lsfile -> file

我擦,看到的软链接的权限丝毫没变,其实际文件的权限变了,再试一次,如下:

[oracle@master ~]$ chmod +rw,u+x,g+x lsfile
[oracle@master ~]$ ll file lsfile
-rwxr-xr-- 1 oracle oinstall 0 Jul 17 23:40 file
lrwxrwxrwx 1 oracle oinstall 4 Jul 17 23:40 lsfile -> file

我擦,真的,改变软链接权限实际看来就是改变了其实际指向文件的权限,而软链接权限永远都是777。

再来测试,改变实际文件的属组看看,如下:

[oracle@master ~]$ sudo chown root.root lsfile 
[oracle@master ~]$ ll file  lsfile 
-rwxr-xr-- 1 root   root     0 Jul 17 23:40 file
lrwxrwxrwx 1 oracle oinstall 4 Jul 17 23:40 lsfile -> file			#软连接的属组没变

[oracle@master ~]$ sudo chown oracle.ntp  file 
[oracle@master ~]$ ll file 
-rwxr-xr-- 1 oracle ntp 0 Jul 17 23:40 file
[oracle@master ~]$ ll file  lsfile 
-rwxr-xr-- 1 oracle ntp      0 Jul 17 23:40 file
lrwxrwxrwx 1 oracle oinstall 4 Jul 17 23:40 lsfile -> file

[oracle@master ~]$ sudo chown  root:dba lsfile 
[sudo] password for oracle: 
[oracle@master ~]$ ll file  lsfile 
-rwxr-xr-- 1 root   dba      0 Jul 17 23:40 file					#属组和属组改变了
lrwxrwxrwx 1 oracle oinstall 4 Jul 17 23:40 lsfile -> file			#软链接显示的属组和属组没有改变了


对目录创建软链接看看,如下:
[oracle@master ~]$ mkdir test && ln -s test lntest	&& touch test/filexxx		#对test目录创建一个软建立并创建一个普通文件
[oracle@master ~]$ ll  test/filexxx 
-rw-r--r-- 1 oracle oinstall 0 Jul 18 00:01 test/filexxx
[oracle@master ~]$ ll  lntest/filexxx 
-rw-r--r-- 1 oracle oinstall 0 Jul 18 00:01 lntest/filexxx

[oracle@master ~]$ chmod 000 test/filexxx 							#对test/filexxx 改变权限
[oracle@master ~]$ ll test/filexxx 
---------- 1 oracle oinstall 0 Jul 18 00:01 test/filexxx
[oracle@master ~]$ ll lntest/filexxx 
---------- 1 oracle oinstall 0 Jul 18 00:01 lntest/filexxx			

[oracle@master ~]$ chmod +rw ./lntest/filexxx 						#再加回权限
[oracle@master ~]$ ll test/filexxx  lntest/filexxx 
-rw-r--r-- 1 oracle oinstall 0 Jul 18 00:01 lntest/filexxx
-rw-r--r-- 1 oracle oinstall 0 Jul 18 00:01 test/filexxx


[oracle@master ~]$ ll test/      lntest/ -d						#查看目录的权限
drwxr-xr-x 2 oracle oinstall 21 Jul 18 00:01 lntest/
drwxr-xr-x 2 oracle oinstall 21 Jul 18 00:01 test/

[oracle@master ~]$ sudo chown -R root:dba lntest/					#修改软链接的属组和属主
[oracle@master ~]$ ll test/      lntest/ -d
drwxr-xr-x 2 root dba 21 Jul 18 00:01 lntest/						#两者的属组和属主都改变了
drwxr-xr-x 2 root dba 21 Jul 18 00:01 test/
[oracle@master ~]$ ll test/      lntest/ 
lntest/:
total 0
-rw-r--r-- 1 root dba 0 Jul 18 00:01 filexxx						#加了-R,所以其下的文件属组和属主都变了
test/:
total 0
-rw-r--r-- 1 root dba 0 Jul 18 00:01 filexxx

[oracle@master ~]$ sudo chown -R  oracle:root test/				#修改的是实际文件的权限
[oracle@master ~]$ ll test/      lntest/ -d
drwxr-xr-x 2 oracle root 21 Jul 18 00:01 lntest/					#两者的属组和属主都改变了
drwxr-xr-x 2 oracle root 21 Jul 18 00:01 test/						#两者的属组和属主都改变了

[oracle@master ~]$ chmod -x test/									#改变实际文件的权限试试
[oracle@master ~]$ ll test/      lntest/ -d					
drw-r--r-- 2 oracle root 21 Jul 18 00:01 lntest/					#两者的权限都改变了
drw-r--r-- 2 oracle root 21 Jul 18 00:01 test/						#两者的权限都改变了

[oracle@master ~]$ chmod +x lntest/								#改变软链接文件的权限试试
[oracle@master ~]$ ll test/      lntest/ -d
drwxr-xr-x 2 oracle root 21 Jul 18 00:01 lntest/					#两者的权限都改变了
drwxr-xr-x 2 oracle root 21 Jul 18 00:01 test/						#两者的权限都改变了

总结

对指向普通文件类型的软链接来说:
1、以后直接对/etc/rc.d/rc.local 赋予可执行权限;
2、修改软链接的内容就是修改实际文件的内容;
3、创建一个普通文件的软链接的其权限默认就是777,但不要易误以为看到软链接具有的权限就以为其实际文件也具有权限,这是错误的看法;
4、对软链接进行权限chmod、属主属组chown的修改,其权限修改结果会直接反映到其实际文件,但软链接具有的权限及属主属主仍保持不变;
5、当实际文件的属主属组改变了,由于第3点所说的,所以建议删除软链接,重新建立软链接;

对指向目录类型的软链接来说:
6、无论对软链接还是对实际目录文件作出权限属主等的修改,两者都是保持一致的。

以上,就是本人测试的结果,可能不是完全的正确,欢迎懂的人多多交流。

<think>好的,用户想修改rc.local文件来实现软件开机自启动。首先,我需要回忆一下相关的步骤和可能遇到的问题。根据之前的引用内容,有几个关键点需要注意。 首先,用户可能需要检查rc.local文件是否具有可执行权限。引用[2]和[3]都提到,默认情况下rc.local可能没有执行权限,需要使用chmod +x命令添加权限。这是第一步,因为如果文件执行,系统会运行其中的命令。 接下来是编辑rc.local文件本身。用户需要以root权限打开文件,比如使用sudo nano或者vim。然后,在文件中添加需要启动的命令或脚本。这里需要注意的是,引用[2]强调命令应该能在无登录环境下运行,可能需要使用绝对路径,避免依赖环境变量。 然后,考虑到现代Linux系统可能使用systemd,引用[1]和[4]提到可能需要处理systemd的兼容性问题。比如,确保rc-local服务已启用并启动,否则即使配置了rc.local,也可能生效。用户可能需要创建或启用相应的服务单元,如rc-local.service,并确保其配置正确。 另外,用户可能会遇到脚本权限的问题,除了rc.local本身的权限外,启动的脚本也需要可执行权限,如引用[3]中提到的chmod +x startall.sh。这也是常见的问题点,需要提醒用户检查。 还有,用户可能在配置后没有生效,这时候需要检查日志,使用systemctl status rc-local.service或者journalctl来查看错误信息,帮助排查问题。这有助于快速定位是权限问题、路径问题还是其他配置错误。 总结步骤应该是:1. 确保rc.local执行;2. 编辑文件添加命令;3. 处理systemd服务;4. 检查脚本权限;5. 测试和调试。同时,用户可能需要了解同Linux发行版(如Ubuntu和CentOS)的差异,比如文件路径可能同,或者systemd配置略有区别。 最后,生成相关问题的时候,需要考虑用户可能的后续疑问,比如权限问题、systemd替代方法、日志查看等,这些都是用户可能会遇到的进一步问题。</think>### 如何配置`rc.local`实现开机自启动 以下是分步操作说明(以Ubuntu/CentOS为例): 1. **检查`rc.local`文件权限** - 默认情况下,`rc.local`可能没有可执行权限。需执行: ```bash sudo chmod +x /etc/rc.d/rc.local # CentOS sudo chmod +x /etc/rc.local # Ubuntu ``` 权限问题是最常见的配置失败原因[^2][^3]。 2. **编辑`rc.local`文件** - 使用`sudo`权限编辑文件: ```bash sudo nano /etc/rc.local # Ubuntu sudo nano /etc/rc.d/rc.local # CentOS ``` - 在`exit 0`语句前添加需要执行的命令,例如: ```bash /absolute/path/to/your_script.sh & ``` **注意**: - 必须使用绝对路径(避免依赖环境变量); - 末尾的`&`表示后台运行,防止阻塞启动流程。 3. **处理systemd兼容性问题** - 如果系统使用`systemd`(如Ubuntu 18.04+或CentOS 7+),需确保`rc-local.service`已启用: ```bash # 创建服务文件(若存在) sudo nano /etc/systemd/system/rc-local.service ``` 写入以下内容: ```ini [Unit] Description=/etc/rc.local Compatibility ConditionPathExists=/etc/rc.local [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 RemainAfterExit=yes [Install] WantedBy=multi-user.target ``` - 启用服务并启动: ```bash sudo systemctl enable rc-local.service sudo systemctl start rc-local.service ``` 该方法能确保`rc.local`在systemd环境下生效[^1][^4]。 4. **验证配置** - 重启系统后检查服务状态: ```bash systemctl status rc-local.service ``` - 查看日志确认命令是否执行: ```bash journalctl -u rc-local.service ``` --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值