我开发一个进程 ,进程调用和运行都没有问题,然后我就写了个shell脚本,
这个脚本是检测进程是否存在,要是没有存在的话就启动进程,然后我把shell脚本放在crontab里面五分钟检测一次,
但进程不存在而要启动时提示:
error while loading shared libraries:libclntsh.so.9.0:cannot open shared object file:No such file or directory
但直接运行脚本是不会报错的!!
我以前遇到同样的一次,哪次是使用exec()调用的,也有同样的问题,但哪次使用别的使用编译后就没有问题了,
不过我现在不知道怎么编译了,我想请教这个问题是怎么引起的,我该怎么解决?
///
libclntsh.so.9.0 这个库是oracle 9i :OCI客户端运行时库,如果程序使用了oci读写数据库必定会装载这个库,
它一般在/<oracle安装路径>/product/9.x.x/lib,除非你没有安装oracle客户端的话(在安装时),
就会出现找不到这个库这个问题。
如果安装了,那么程序运行时还是要在/etc/ld.so.conf所列路径下、和LD_LIBRARY_PATH所列路径下
去寻找这个库,如果这两个地方都找不到就会报错,说找不到这个库。我估计你的/etc/ld.so.conf下
肯定没有包含/<oracle安装路径>/product/9.x.x/lib这个路径,但你的用户shell启动脚本(.bash_profile)设置了
LD_LIBRARY_PATH=/<oracle安装路径>/product/9.x.x/lib:...这个环境变量,所以你用用户账号运行程序是没问题的。
但crontab有自己的用户账号,crontab运行时并不会设置LD_LIBRARY_PATH=/<oracle安装路径>/product/9.x.x/lib: 。
所以就找不到库了。
解决办法就是:将/<oracle安装路径>/product/9.x.x/lib路径加入/etc/ld.so.conf,
并运行ldconfig -v(更新动态加载器缓存)就ok了。
/
把你的crontab文件里面的启动条目贴出来看看先
/
*/5 * * * * /home/oracle/process_up
/
设置LD_LIBARAY_PATH
/
谢谢你!我了解的情况基本是:
1,
可以使用
*/5 * * * * su - oracle -c ....sh
来每5分钟执行一次,这样可以逼开ORACLE_HOME必须设置的问题,
2,
在shell脚本里必须使用
ORACLE_HOME = .....
export ORACLE_HOME
这样来设置crontab执行的shell的环境
-------------------------
注:在使用crontab调度时,程序可能会报找不到动态库,但直接执行程序则没有问题。
这个问题一般是由于crontab的执行用户是root,而root的环境变量中没有设置指明程序需要的动态库路径。
如果调度的程序是shell脚本,可以将执行程序的用户的环境变量复制一份到shell脚本的开头,即可。