rc.local脚本延时启动

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 180可以

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是一个脚本,是按顺序执行的,执行完一个程序后才会执行下一个程序,如果某程序不是后台程序,就应该加&让程序运行在后台,否则rc.local会挂起。

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

顺序运行体现在:
②可以执行,②也是依赖docker服务,但经过sleep 60后docker已经起来了,所以②可以执行。
在这里插入图片描述

注意:
不要让一个脚本挂起,挂起意味着这个脚本后面的脚本都不能执行了。
如下图所示,把每个脚本的标准错误和标准输出重定向,并后台执行每个脚本。
在这里插入图片描述

5.3.2、一个脚本挂起的例子

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

猜你喜欢

转载自blog.csdn.net/OceanWaves1993/article/details/130151247