最近使用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