linux会在开机之后自动source执行/etc/rc.local 那么它与init.d目录中的脚本有什么区别呢? 

上一篇博客其实已经说了这两种脚本的作用了,这里再具体说一点 


个人理解: init.d目录中的脚本都是以服务的形式启动的,顾名思义,服务会在后台一直运行

所以,系统在执行init.d目录中的服务脚本时,会分别单独为每个服务脚本启动一个非登录非交互式shell来始终在后台运行服务脚本一直到用户退出登录,关闭系统,

这些始终运行在各个非登录非交互式的shell中的服务脚本才会停止运行 


那么/etc/rc.local这个脚本呢,它是怎么运行的呢

可以打开这个脚本看看,发现默认只有一行命令: 

exit 0 

说明,这个脚本要以0这个返回参数来结束这个脚本的运行,而系统则要以是否得到0这个返参来决定是否继续进行下一步开机步骤

那么,可以这样理解,rc.local这个脚本中的命令不能像服务脚本那样始终占用这个系统为了执行rc.local而启动的非登录非交互式shell,

而应该每一条命令都可以自动执行完毕,一直执行到:exit 0 这句命令,而且是必须执行到这句命令,否则系统将卡在这个脚本,无法继续开机 


比如,rc.local中可以在‘exit 0’这一行上面写如下的几种命令: 

ls echo 12345>/home/text.txt 

rm -rf /home/user/.cache 

..........

等等,可以自动执行到结束的命令,不需要手动结束这个命令

等所有命令运行结束后就会运行exit 0来退出当前shell,当这个shell退出后,系统才会继续下一步开机步骤 

但是,不可以写,不能自动执行完毕的命令!

如: 

/etc/init.d/xxx.sh(一个服务脚本) start 

或者:

cat (单独执行cat命令会等待用户输入,直到用户按下Ctrl+d后才会退出cat命令) 

以上两个命令都不能自动执行到命令结束或是需要用户操作才能结束命令的运行

那么这种命令就会始终占用系统为rc.local开启的shell,导致这个shell无法执行到exit 0这句命令

也就是说这个shell无法以0为返参退出,那么系统就会始终等待这个shell退出,从而导致无法继续开机 


上面说了,运行rc.local的shell必定要退出关闭(否则无法开机),所以rc.local这个脚本中,不要写设置系统环境变量的命令,或者是设置alias别名的语句

因为环境变量和别名的作用域都是当前shell,当这个shell退出后,这些变量和别名也就不存在了, 

所以环境变量建议写在登录shell配置文件中,也就是/etc/profile中,

而你要使用的别名,可以这样设置:

图形化系统环境:非登录交互式shell的配置文件/etc/bash.rc (还有其他的也可以,这里不多说)

字符系统环境:登录shell的配置文件/etc/profile和非登录交互式shell的配置文件/etc/bash.rc (还有其他的也可以,这里不多说) 


############结束##############