Linux RPM命令阻塞问题

最近使用rpm查看系统安装的软件包时,长时间不返回,Ctrl+Z命令也不能退出rmp命令。

使用strace命令跟踪,发现阻塞在一个文件锁上:

# strace rpm -aq |grep kernel

......
rt_sigaction(SIGPIPE, NULL, {SIG_IGN, [], SA_RESTORER, 0x7fd029e2d370}, 8) = 0
open("/proc/meminfo", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd02c59b000
read(3, "MemTotal:       98064036 kB MemF"..., 1024) = 1024
close(3)                                = 0
munmap(0x7fd02c59b000, 4096)            = 0
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
read(3, "0-23 ", 8192)                 = 5
close(3)                                = 0
umask(022)                              = 022
open("/var/lib/rpm/.dbenv.lock", O_RDWR|O_CREAT, 0644) = 3
umask(022)                              = 022
fcntl(3, F_SETLKW, {type=F_WRLCK, whence=SEEK_SET, start=0, len=0}

查看 /var/lib/rpm/.dbenv.lock 被哪个进程持有:

# lsof /var/lib/rpm/.dbenv.lock
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
abrt-acti 9801 root    3uW  REG    8,2        0 2056506 /var/lib/rpm/.dbenv.lock

把abrt-acti相关进程杀掉后,还是长时间不返回,但是CTRL+C可以退出命令。

跟踪发现,是在对文件/var/lib/rpm/__db.002做futex 操作时,一直在等待;删除这个文件后,又出现SIGBUS错误。

最终解决方法是重建rpm db信息,具体方法如下:

1. rm /var/lib/rpm/*db*
2. rpm -vv --rebuilddb
3. rpm -qa  ##查询正常


参考链接:
https://bugzilla.redhat.com/show_bug.cgi?id=129599


原文地址:https://www.cnblogs.com/smith9527/p/Linux.html