1、背景
新上了个python服务,里面有调用oracle,其中有个需求需要定时去调用,贪方便想用crontab,出现了环境变量问题,于是跟他杠上了,势必要解决它!
2、现象
尽管我在计划任务里写全了脚本路径,甚至让它重新加载环境变量,不管是source /etc/profile
还是source /home/xxx/.bashrc
还是把所有的执行命令都写了绝对路径,都会报错,报错如下:
Traceback (most recent call last):File "manager.py", line 20, in <module>cx_Oracle.init_oracle_client(lib_dir=path_to_oracle_client_lib)
cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: "/home/xxxx/project/install/instantclient_11_2/libclntsh.so: cannot open shared object file: No such file or directory". See https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html for help
根据提示,我去指定路径找,确实没有这个文件,官网也下载了很多个版本,确实没有;提示缺依赖包,但是这台机器还有别的服务,不想更新了linux的lib,这个可能会引发很多问题;
最重要的是,同样的命令我直接运行不会报错,一放到crontab就会报这个环境变量问题;
于是我尝试,查询到调用oracle client的时候,有加载这个变量:LD_LIBRARY_PATH
尝试在终端输出这个环境变量的值:
echo $LD_LIBRARY_PATH
原来系统里有这个文件,我指定的目录缺少了这个文件“libclntsh.so”,然而使用source /home/xxx/.bashrc
并不会生效,于是我在计划任务里直接重设这个变量,这时再测试就正常了;
3、具体操作
echo $LD_LIBRARY_PATH
将输出的值复制,加到计划任务里
crontab -e
45 17 * * 1-5 cd /home/xxxx/project/DailyxxxxAuto/ && source /home/xxxx/.bashrc && export LD_LIBRARY_PATH=/u01/app/oracle/product/11.2.0/client_1 && /usr/local/python36/bin/python3 manager.py &> output.log &
主要是加入这个
export LD_LIBRARY_PATH=/u01/app/oracle/product/11.2.0/client_1
4、总结
具体解决办法还是要结合自己生产实际,做每个操作前都需三思而后行。