/etc/rc.local 中部分命令无法执行 在Linux系统中我们有可能需要某些命令在系统启动的时候自动运行。此时我们会想到利用文件:/etc/rc.d/rc.local 按照正常逻辑,只需要将相应的shell命令写入该文件,下次系统启动就会自动执行这些命令。然而事情往往没有这么顺利。 大部分人遇到的问题是rc.local里面的命令都不执行。这个通常是因为没有赋予该文件可执行权限。一条命令'chmod +x /etc/rc.d/rc.local'就可以解决问题。 而这次我遇到的问题是rc.local文件里面部分命令运行了,部分(httpd -k start)没有运行。引起这个问题的是多种原因。 1. 命令没有使用绝对路径。 2. SELinux阻止了该命令的运行。 3.命令存放在/usr/local/bin/目录下 在系统执行这些命令时将报错,无法正常执行!究其原因: 由于在执行rc.local脚本时,PATH环境变量未全部初始化,目录/usr/local/bin/ 需在执行/etc/profile 后才被添加到环境变量PATH中。 故,在 /etc/rc.local 执行 /usr/local/bin/ 目录中的命令需要使用绝对路径 第一中情况容易解决。第二种要麻烦一些。我们可以通过查看系统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 --------------------------------------------------- --------------------------------------------------- #num2 Linux开机启动文件rc.local无法执行怎么办 第一种情况:当centOS 随机启动文件 /etc/rc.local 失效时请按如下修改: 1、echo /etc/rc.local >>/etc/profile && source /etc/profile 注:当执行生效会看到效果(/etc/profile 文件在每个用户登录时会首先检查并执行) 2、reboot注:重新启动检测是否生效 第二种情况:echo /etc/rc.local >>~/.bash_profile && source /etc/profile。 第三种情况:在 /etc/init.d 目录下增加对应程序启动脚本,然后重启测试,内容如下:chkconfig --add 脚本名(将该脚本注册到系统服务,此时直接输入脚本可以直接运行)。 chkconfig 脚本名 on(将该服务加入随系统开机启动),添加自启动,必须在脚本里面加入chkconfig 启动顺序,才能加入进去。 /etc/rc.local 中部分命令无法执行。 在linux系统中添加随系统启动而自动运行的服务,只需在/etc/rc.local 脚本文件中添加即可,当运行的命令或程序不带路径时,例如: #!/bin/bash distccd --user nobody --allow 10.10.98.0/24 --log-file=/var/log/distcc.log --verbose --daemonloadavg -s 10.10.98.20 >/dev/null 2>&1 注意,distccd、loadavg命令存放在/usr/local/bin/目录下 在系统执行这些命令时将报错,无法正常执行! 由于在执行rc.local脚本时,PATH环境变量未全部初始化,目录/usr/local/bin/ 需在执行/etc/profile 后才被添加到环境变量PATH中。 解决方法:在 /etc/rc.local 执行 /usr/local/bin/ 目录中的命令需要使用绝对路径。 1、使用runlevel或者who -r查看服务器的运行级别,根据运行级别查看/etc/rc.d/rcX.d/S99local -> ../rc.local,所指向的rc.local文件位置是否正确。一般是正确的 默认在/etc/rc.d/rc.local下面,/etc/rc.local只是它的一个symlink。 2、注意在rc.local中的脚本尽量使用绝对路径,脚本要加执行权值,脚本使用的服务和环境变量必须先加载,否则脚本会执行错误而退出。 3、理解linux启动的流程,即init脚本先执行,最后再执行rc.local中的命令。 4、要使用普通用户的环境变量需要在rc.local中使用export var=xxx先导出或者使用source /etc/profile,使环境变量生效才能使用,或者是sleep 10 (以s为单位),等其他的必须服务启动后。 5、在rc.local中的脚本不能执行时,我们可以在脚本中使用set -x打开脚本的调试功能,并且将输出重定向到一个文件中,便于查看出错原因。如/root/echo.sh >> /root/debug.txt 再执行相关的脚本命令部分