最近遇到了个奇怪的问题。费了一番周折才最终解决。在此给遇到类似问题的同学提供一条思路。
在Linux系统中我们有可能需要某些命令在系统启动的时候自动运行。此时我们会想到利用文件:/etc/rc.d/rc.local
按照正常逻辑,只需要将相应的shell命令写入该文件,下次系统启动就会自动执行这些命令。然而事情往往没有这么顺利。
大部分人遇到的问题是rc.local里面的命令都不执行。这个通常是因为没有赋予该文件可执行权限。一条命令'chmod +x /etc/rc.d/rc.local'就可以解决问题。
而这次我遇到的问题是rc.local文件里面部分命令运行了,部分(httpd -k start)没有运行。引起这个问题的是多种原因。下面列举两个:
1. 命令没有使用绝对路径。
2. SELinux阻止了该命令的运行。
第一中情况容易解决。第二种要麻烦一些。我们可以通过查看系统log。例如:CentOS7, /var/log/messages 文件中,会发现类似下面的log:
SELinux is preventing /usr/sbin/httpd from append access on the file......
这时,可以查看SELinux相关log。其路径通常在/var/log/audit下面。
audit.log audit.log.1 audit.log.2 audit.log.3 audit.log.4
直接阅读比较难懂我们可以通过运行:sealert -a audit.log (没有sealert命令的可以通过yum install setroubleshoot安装)
经过解析可以获得更加具体的信息,如:
SELinux is preventing /usr/sbin/httpd from write access on the file 83b1a642e5418ddb34687eb7571913ce63e1f0b4.
为了去除SELinux对rc.local的干扰。我们可以在运行命令前停掉SELinux.
/usr/sbin/setenforce 0
在运行命令后在将SELinux起来。
/usr/sbin/setenforce 1
可以通过getenforce来查看SELinux有没有运行。
[root@centos7 audit]# getenforce
Enforcing