文章目录
一. yum命令报错详情
在操作linux时,发现测试环境某集群所有机器的yum命令忽然报错
#比如如下命令:
yum list
yum install <package_name>
详细报错信息如下:
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:
No module named yum
Please install a package which provides this module, or
verify that the module is installed correctly.
It's possible that the above module doesn't match the
current version of Python, which is:
2.7.5 (default, Apr 2 2020, 13:16:51)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
If you cannot solve this problem yourself, please go to
the yum faq at:
http://yum.baseurl.org/wiki/Faq
二. 报错原因分析
谷歌相关资料.发现大部分回答都是说yum和python版本不一致导致的.
原因: yum和pathon是依赖关系,yum本质上是python的一个模块
打开/usr/bin/yum,我们可以看到其实它执行的是python,并且导入了yum模块
所以他们的解决方案是修改yum文件
vim /usr/bin/yum
# 将文件头的#!/usr/bin/python修改为对应的Python版本
我思考了一下,之前yum命令都是正常的,也没有重装过python或升级过Python的版本
所以认为不是该原因,也就没有按照相关的提示操作
后面排查发现,yum命令出现问题前执行的某个脚本里有这样的一行命令:
rm -rf /usr/lib/*
这个命令又写在循环里,导致这个集群所有机器出现问题
真是好家伙,还好是没人折腾的测试集群,不然我得琢磨着跑路了~
三. 解决过程
关于该问题,最简单的解决办法就是:
从其它的集群找到一台正常的主机,将**/usr/lib/**下的文件通过scp命令拷贝过去
…
漫长的等待过后,拷贝完成
3.1 新的报错
拷贝结束后,执行yum命令
发现还是不能正常使用,报错如下:
Loaded plugins: fastestmirror, priorities
Traceback (most recent call last):
File "/usr/bin/yum", line 29, in <module>
yummain.user_main(sys.argv[1:], exit_code=True)
File "/usr/share/yum-cli/yummain.py", line 375, in user_main
errcode = main(args)
File "/usr/share/yum-cli/yummain.py", line 170, in main
base.getOptionsConfig(args)
File "/usr/share/yum-cli/cli.py", line 296, in getOptionsConfig
(opts, self.cmds) = self.optparser.setupYumConfig(args=args)
File "/usr/share/yum-cli/cli.py", line 2368, in setupYumConfig
if not self.base.conf.usercache and os.geteuid() != 0:
AttributeError: 'YumConf' object has no attribute 'usercache'
根据报错提示谷歌,基本上没找到类似的解决方法
只能按照报错提示查看相关源码
没发现什么有用的信息…(估计主要原因是我对python没什么了解)
使用pdb排查问题
接下来,想到之前写java时,往往借助debug排查问题,那么Python,能否使用debug帮助我理解yum运行代码呢?
谷歌了一下python的debug
发现可以使用pdb这种方式
在排查过程中,我主要用到了以下几条pdb命令,如下:
s : 执行下一条命令,主要用来跳转到执行函数的代码
n : 执行下一条语句,如果是函数调用,则执行函数
l : 列出源码
p 变量名: 查看变量内容
具体使用pdb调试可参考以下博客:
实操如下:
首先修改/usr/bin/yum文件,引入pdb依赖,使用pdb调试
# 在该文件第三行和第三十行添加如下内容,使用pdb调试,
# 使我们可以通过debug的形式进入到yum启动的主要方法yummain.user_main(sys.argv[1:], exit_code=True)
import pdb # 第三行添加
pdb.set_trace() # 第30行添加
修改后的/usr/bin/yum文件内容如下:
#!/usr/bin/python
import sys
import pdb
try:
import yum
except ImportError:
print >> sys.stderr, """\
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:
%s
Please install a package which provides this module, or
verify that the module is installed correctly.
It's possible that the above module doesn't match the
current version of Python, which is:
%s
If you cannot solve this problem yourself, please go to
the yum faq at:
http://yum.baseurl.org/wiki/Faq
""" % (sys.exc_value, sys.version)
sys.exit(1)
sys.path.insert(0, '/usr/share/yum-cli')
try:
import yummain
pdb.set_trace()
yummain.user_main(sys.argv[1:], exit_code=True)
except KeyboardInterrupt, e:
print >> sys.stderr, "\n\nExiting on user cancel."
sys.exit(1)
接下来执行yum脚本,开始进行调试,命令如下:
python /usr/bin/yum
通过 s, n,l 组合拳,以及在关键的部分通过p命令获取变量值
逐步缩小范围,排查过程比较恶心,不多加赘述,重点关注报错代码相关的方法可加快调试效率
最后将报错范围定位到 /usr/share/yum-cli/cli.py文件的setYumConfig()方法
到这里,我找到了一台能正常执行yum命令的服务器,通过同样的办法,
在setYumConfig()方法这里一点一点对比执行差异
发现,同样的输出内容,居然对应了不同的代码行数
如下图所示:(异常的yum对应源码)
正常的Yum对应的源码
说明了机器覆盖过来的yum实际上是不一样的!
因此,问题找到!
**用正常机器的/usr/share/yum-cli将异常机器的该文件夹覆盖,问题解决! **
覆盖之后,发现,yum命令正常执行
因为一条危险的命令,半天的时间心惊肉跳,总算把问题修复
全是泪!!!
操作还是要仔细小心,不管是生产环境还是测试环境.否则就是在给自己挖坑啊
最后,提醒大家
慎用rm -rf !!!
慎用rm -rf !!!
慎用rm -rf !!!