rc.local脚本延时启动
- 1、问题描述
- 2、解决方法
- 3、rc.local脚本依赖关系的处理
- 3.1、对脚本进行分类,分别设置延时启动策略
- 4、测试重启rc-local.service
- 5、rc.local脚本执行特点
- 5.1、rc.local脚本在操作系统启动时只执行一次。
- 5.2、在rc.local脚本中执行程序时是没有环境变量的,如果执行的程序需要环境变量,需要在脚本中设置环境变量。
- 5.3、rc.local是一个脚本,是按顺序执行的,执行完一个程序后才会执行下一个程序,如果某程序不是后台程序,就应该加&让程序运行在后台,否则rc.local会挂起。
- 5.3.1、下图中①执行时docker服务还没起来,所以①不能执行。
- 5.3.2、一个脚本挂起的例子
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次循环。这个不仅影响本脚本不能正常启动。
还有重大影响的是本脚本后面的所有脚本均不能执行。