一、问题描述
某次GreenPlum集群部署过程中,现场人员反馈,yum命令无法使用了,执行报错:No module named yum,如下所示:
相关资料:YUM
二、问题分析处理
2.1 YUM的本质
yum命令本质上是属于python的一个模块,打开/usr/bin/yum,会发现第一行命令#!/usr/bin/python,即它执行器/解析器是python,并且导入了yum模块。而python有一个非常重要的lib库文件,默认在**/usr/lib64**目录下,全名叫 libpython2.7.so.1.0(对应python2.7),python每次执行首先会调用该lib库,python与lib库是一一对应关系。 正常yum是通过系统自带的python使用的,也就是它需要调用OS自带的python的lib库,yum调用python使用的是绝对路径,它强依赖此python,当yum命令找不到原先它调用的库文件时,就会报如上错误信息,所以我们要做的就是让yum继续能调用原来的python以及原来python的lib库。
现场GPDB部署后,它自身带了python的2.7和3.4版本和相应库文件,一旦配置了全局环境变量,必然修改了python库或执行文件路径,导致yum调用失败报错。现场检查环境变量PYYHONHOME也可知;
针对上述问题,注释环境变量配置,注销后重新打开即可
2.2、升级python或使用高版本注意
可惜并未找到相关资料说明,yum有配置lib库文件路径的地方,它还是在默认路径中查找lib库文件;那么,当我们升级完python后,lib库文件更新,我们就需要给yum配置额外的lib库文件路径或将旧的库文件添加到新的库文件中,配置方法如下:
1)新增配置lib库路径,通过配置LD_LIBRARY_PATH全局环境变量来实现
LD_LIBRARY_PATH是用来指定查找共享库(动态链接库)时除了默认路径(/lib and /usr/lib)之外的其他路径。我们可将新的库文件目录设置到LD_LIBRARY_PATH中来让系统找到;
vim /etc/bashrc #或/etc/profile
export LD_LIBRARY_PATH=/usr/local/python2.7.15/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/python2.7.15/bin:$PATH
#或
cp /usr/lib64/libpython2.7.so.1.0.bak /usr/local/python2.7.5/lib/libpython2.7.so.1.0
mv /usr/bin/yum /usr/bin/yum-exec #重命名
#新建/usr/bin/yum文件,内容如下:
#$@和$*都表示命令行所有的参数(不包含$0),但是$*将命令行所有的参数看成一个整体,而$@则区分各个参数
#!/bin/bash
export LD_LIBRARY_PATH=/usr/local/python2.7.5/lib/
/usr/bin/yum-exec $*
#添加可执行权限:
chmod +x /usr/bin/yum
#检查yum是否已经可用
yum list installed
yum --version
知识回顾:
1、$#:表示执行脚本传入参数的个数
2、$*:表示执行脚本传入参数的列表(不包括$0)
3、$$:表示进程的id;Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号)
4、$!:Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号)
5、$@:表示获取执行脚本传入的所有参数
6、$0:表示执行的脚本名称
7、$1:表示第一个参数
9、$?:表示脚本执行的状态,0表示正常,其他表示错误
2)替换文件(推荐)
# 备份原来的lib库文件
mv /usr/lib64/libpython2.7.so.1.0 /usr/lib64/libpython2.7.so.1.0.bak
# 将python的bin目录加入到PATH中
echo 'export PATH=/usr/local/python2.7.15/bin:$PATH' >> /etc/profile
# 将新的lib库文件拷贝至/usr/lib64下
cp /usr/local/python2.7.15/lib/libpython2.7.so.1.0 /usr/lib64/
source /etc/profile
三、附录
3.1、 LIBRARY_PATH 和 LD_LIBRARY_PATH
LIBRARY_PATH is used by gcc before compilation to search for directories containing libraries that need to be linked to your program.程序编译期间查找动态链接库时指定查找共享库的路径
LD_LIBRARY_PATH is used by your program to search for directories containing the libraries after it has been successfully compiled and linked.程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径