【已解决】Linux中程序脚本可以手动执行成功,但加在rc.local中不能开机自启

之前开发遇到的一个问题:在Linux中,明明程序脚本可以手动执行成功,但加到开机自启动里,却会失败,属实让人摸不着头脑。

问题排查:

有以下几种可能:

  1. 自启动脚本,执行权限不足或者脚本中使用了相对路径;
  2. 程序依赖其他服务,需要等待前置服务完全可用,比如依赖数据库、消息队列等;
  3. 开机启动时未加载用户自定义的环境变量(如PATH、LD_LIBRARY_PATH等)

解决办法

前两个很好解决,设置权限,修改脚本,增加sleep时间即可。

而博主刚好遇到是第三种情况,软件需要配置自定义的环境变量,尽管在/etc/profile中已经设置了环境变量,但是当只把程序的开启自启动加在rc.local中时,程序所需要的环境变量并不会被自动加载进来。可以在rc.local中在xx.sh命令之前先export 自定义的环境变量,完美解决。

深入分析

追本溯源,先来看一下Linux系统中rc.local的启动顺序

复制代码
第一步:init /etc/inittab
第二步:启动相应的脚本,并且打开终端
rc.sysinit
rc.d(里面的脚本)
rc.local
第三步:启动login登录界面 login
第四步:在用户登录的时候执行sh脚本的顺序,每次登录的时候都会完全执行的
/etc/profile.d/file
/etc/profile
/etc/bashrc
/root/.bashrc
/root/.bash_profile

这说明rc.local运行在操作系统完全引导成功,但是尚未启动login shell之前。比如我们可以在rc.local中加入env把环境变量打印出来,可以看到环境变量非常少。如果我们在/etc/profiles或bashrc中配置了环境变量,xx.sh依赖这些环境变量,由于rc.local执行阶段看不到这些环境变量,所以会执行失败。

该问题的解决办法:在rc.local中在xx.sh命令之前加上export。

相关推荐
正在走向自律14 小时前
AI数据分析与可视化:从基础到应用实践
服务器·人工智能·python·机器学习·数据分析·pandas
OnlineProxy15 小时前
亚马逊多账号运营:如何在规避“关联封号”风险的同时实现电商规模化扩张
服务器·数据库·redis
Android系统攻城狮15 小时前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
H.莓飛16 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
91刘仁德16 小时前
IP协议详解:从IP协议头到网段划分、路由与NAT
linux·服务器·网络·网络协议·tcp/ip
辻弋20116 小时前
五年前的旅行视频糊成马赛克?Video2X用Real-ESRGAN逐帧重建细节,但只支持Windows、集显用户建议直接放弃
服务器·数据库·windows·游戏引擎·电脑
硅基手札17 小时前
【Linux内核专栏 14】网络协议栈
linux·运维·网络协议
沫璃染墨19 小时前
《Linux工程实践篇(一):认识设计模式——从日志系统看策略模式》
linux·c++·安全·设计模式·策略模式
工作10年+,存储芯片行业19 小时前
Linux NVMe 中断排查与性能优化:CPU 亲和性
linux·运维·服务器·windows·性能优化·ssd·pcie
wuminyu19 小时前
ForkJoinPool内部WorkQueue的Lock-Free数组操作以及并发任务窃取原理剖析
java·linux·c语言·jvm·c++