[Problem one]服务自启动导致无法找到动态库文件

前言

这个标题定的有点大了,该问题并不具有通用性,只是解决方案可能会有一定的参考意义。主要还是想记录下工作中遇到的问题以及在解决问题的过程中发散思考学习到的一些知识。

问题说明

系统版本:Linux REHL7.3
事件缘由:tomcat设置自启动
设置tomcat自启动方式:
有很多方式,比如注册tomcat服务,添加shell脚本,可以参考我的一篇博客《Linux下Tomcat开机自动启动》
这里采用的是以下方式:
1) vi /etc/rc.d/rc.local
2) 添加以下内容:

export JAVA_HOME=/usr/local/java
/usr/local/tomcat/bin/startup.sh

诱发问题:Oracle动态库找不到:sqlplus: error while loading shared libraries: libsqlplus.so: cannot open shared object file: No such file or directory

解决历程

1️⃣ 第一感觉是,sqlplus所依赖的动态库不存在,因为该机器上没有安装Oracle服务器,仅安装了Oracle客户端,于是先测试:

sqlplus /nolog

发现执行正常,全局搜索该动态库是否存在:

find / -name libsqlplus.so

动态库也存在,于是排除该猜想。

可以通过ldd命名来查看可执行文件依赖的动态链接库,例如:
ldd sqlplus

2️⃣ 既然动态库存在,但是仍然报错找不到该动态库,那么是不是查找路径设置错误呢?验证猜想:
1) 查看环境配置变量LD_LIBRARY_PATH的配置:

echo $LD_LIBRARY_PATH

发现,该动态库所在路径在查找路径中已经配置了,排除该猜想。

该路径既可以在~/.bash_profile中进行配置,也可以在/etc/profile中进行配置

3️⃣ 由现象引起的思考:只要不重启系统,一切运行正常,系统重启就会报错,那么是不是由于系统加载先后顺序的问题?于是网上查找资料,验证,最终发现还真是加载引起的该问题!
redhat的启动方式和执行次序是:

加载内核
执行init程序
/etc/rc.d/rc.sysinit # 由init执行的第一个脚本
/etc/rc.d/rc RUNLEVEL #RUNLEVEL为缺省的运行模式
/etc/rc.d/rc.local #相应级别服务启动之后、在执行该文件(其实也可以把需要执行的命令写到该文件中)
/sbin/mingetty # 等待用户登录

详细可参考《Linux开机启动顺序小结》

问题就是rcS 比/etc/profile先运行,rcS是一开机第一个运行的,这时候你的库还没有被连进来。

/etc/rc.local
/etc/rc.sysinit
/etc/inittab
/etc/profile

因为动态库的路径实在/etc/profile文件中配置的,所以导致找不到动态,实际上是查找路径未设置的问题。

解决方案

1) init时先使配置文件有效,即:source /etc/profile
2) 修改 /etc/rc.d/rc.local文件内容:

export ORACLE_HOME=/opt/oracle
export LD_LIBRARY_PATH=...
export JAVA_HOME=/usr/local/java
/usr/local/tomcat/bin/startup.sh

Over!

猜你喜欢

转载自blog.csdn.net/changqing5818/article/details/77185866