1、问题描述

操作系统:CentOS Linux 7 (Core)
rc.local 放置了不同的自启动脚本,它们所依赖的服务也是不同。
在centos7上遇到问题:rc.local中的一个脚本依赖于docker 服务,但是开机后并没有运行这个脚本。systemctl status rc-local.service 查看是这个脚本运行所依赖的docker 服务没有运行,但docker服务是设置开机自启的。推测是这个脚本运行时docker服务自启动还没起来。

在这里插入图片描述

2、解决方法

在rc.local依赖于docker服务的脚本中添加延时
sleep xxx
实测sleep 60不行,slepp 120可以

3、rc.local脚本依赖关系的处理

3.1、对脚本进行分类,分别设置延时启动策略

由于rc.local中有多个脚本,每个脚本可能依赖的服务不尽相同。
最低限度要分门别类进行管理,对依赖于docker服务的所有脚本设置统一的延时启动策略。
对依赖于另一个服务的所有脚本设置另一个延时策略。

4、测试重启rc-local.service

开机时没有rc-local.service起来

在这里插入图片描述

对应的脚本启动的服务也没有运行

在这里插入图片描述

重启rc-local.service 会自动运行rc.local配置的所有脚本

在这里插入图片描述

对应的脚本启动的服务已经运行

在这里插入图片描述

5、rc.local脚本执行特点

5.1、rc.local脚本在操作系统启动时只执行一次。

适合执行开机时需要自启动的任务,周期行的任务需要使用cron脚本去触发执行。

5.2、在rc.local脚本中执行程序时是没有环境变量的,如果执行的程序需要环境变量,需要在脚本中设置环境变量。

如果脚本运行需要环境变量,则需要在脚本中设置,否则脚本会运行失败。

在这里插入图片描述

5.3、rc.local是一个脚本,里面的程序是并行执行的,要防止出现程序挂起的情况,如果某程序不是后台程序,就应该加&让程序运行在后台。

5.3.1、下图中①执行时docker服务还没起来,所以①不能执行。

②可以执行,②也是依赖docker服务,但经过sleep $interval后docker已经起来了,所以②可以执行。

在这里插入图片描述

注意:
如下图所示,把每个脚本的标准输出重定向到log文件,标准错误重定向到标准输出,并后台执行每个脚本。

在这里插入图片描述

5.3.2、rc.local并行执行的体现

在这里插入图片描述

在这里插入图片描述

上图中,红色的①②②和黄色的①②,是5个docker 容器,因为容器间有启动先后的依赖顺序,没有用到容器编排服务,因此通过rc.loal shell脚本实现容器的启动先后顺序。这5个容器自身都设置了开机开机不自启, 即"RestartPolicy" 设置为no。

在这里插入图片描述

那么怎么在开机时,启动docker容器呢,通过rc.local 里面运行启动docker 容器的shell脚本即可实现。

在这里插入图片描述

在这里插入图片描述

上图中,红色的①②②是一组具有先后启动依赖顺序的3个docker 容器,其中要求红色①先启动,红色②②后启动并且没有先后顺序;黄色的①②是另一组具有先后启动依赖顺序的2个docker 容器,其中要求黄色①先启动。但是红色和黄色这两组容器之间没有先后启动依赖顺序。
因此实现策略如下:
在rc.loacl文件中,先后执行两个shell脚本,先执行shell脚本A,后执行shell脚本B。
红色的①②②容器通过shell脚本A启动。
黄色的①②容器通过shell脚本B启动。

通过上图可以看出红色①和黄色①是同时启动的, 都是up 3 seconds**,这说明了在rc.loacl文件中,先后执行的两个shell脚本A和B 是并行执行的。**
rc.local脚本设置如下

在这里插入图片描述

5.3.3、一个脚本挂起的例子

在脚本中写了while死循环,然后因为一个判断条件一直不能满足,导致循环卡死,图示已经执行了7176次循环。这个影响本脚本不能正常启动。
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐