加载中...

解决yum update异常中断产生重复包、依赖冲突等问题

前言

事情的起因是执行了 yum update 后,嫌时间长,就手欠儿按了 curl + c 中断了更新,结果就导致了后面一些列问题

问题

问题一:There are unfinished transactions remaining

使用yum相关命令时,一直会有未完成事务的提醒,这时候我们需要完成这个事务。

解决方法:使用yum-complete-transaction命令清理未完成事务,使用该命令是需要先安装 yum-utils 工具包

# 安装工具包
yum install yum-utils

#清空缓存
yum clean all

# 清楚未完成事务
yum-complete-transaction --cleanup-only

贴一下打印内容:

There are unfinished transactions remaining. You might consider running yum-complete-transaction, or "yum-complete-transaction --cleanup-only" and "yum history redo last", first to finish them. If those don't work you'll have to try removing/installing packages by hand (maybe package-cleanup can help).
The program yum-complete-transaction is found in the yum-utils package.

问题二:提示有一堆的重复包 xxx is a duplicate with xxx

贴一下代码:

acl-2.2.51-15.el7.x86_64 is a duplicate with acl-2.2.51-14.el7.x86_64
audit-2.8.5-4.el7.x86_64 is a duplicate with audit-2.8.1-3.el7_5.1.x86_64
audit-libs-2.8.5-4.el7.x86_64 is a duplicate with audit-libs-2.8.1-3.el7_5.1.x86_64
avahi-libs-0.6.31-20.el7.x86_64 is a duplicate with avahi-libs-0.6.31-19.el7.x86_64
bash-4.2.46-35.el7_9.x86_64 is a duplicate with bash-4.2.46-30.el7.x86_64
32:bind-license-9.11.4-26.P2.el7_9.13.noarch is a duplicate with 32:bind-license-9.9.4-61.el7_5.1.noarch
binutils-2.27-44.base.el7_9.1.x86_64 is a duplicate with binutils-2.27-28.base.el7_5.1.x86_64
ca-certificates-2022.2.54-74.el7_9.noarch is a duplicate with ca-certificates-2018.2.22-70.0.el7_5.noarch
centos-release-7-9.2009.1.el7.centos.x86_64 is a duplicate with centos-release-7-5.1804.5.el7.centos.x86_64
chkconfig-1.7.6-1.el7.x86_64 is a duplicate with chkconfig-1.7.4-1.el7.x86_64
chrony-3.4-1.el7.x86_64 is a duplicate with chrony-3.2-2.el7.x86_64
coreutils-8.22-24.el7_9.2.x86_64 is a duplicate with coreutils-8.22-21.el7.x86_64
cpio-2.11-28.el7.x86_64 is a duplicate with cpio-2.11-27.el7.x86_64
cpp-4.8.5-44.el7.x86_64 is a duplicate with cpp-4.8.5-28.el7_5.1.x86_64
cronie-1.4.11-25.el7_9.x86_64 is a duplicate with cronie-1.4.11-19.el7.x86_64
cronie-anacron-1.4.11-25.el7_9.x86_64 is a duplicate with cronie-anacron-1.4.11-19.el7.x86_64
cryptsetup-libs-2.0.3-6.el7.x86_64 is a duplicate with cryptsetup-libs-1.7.4-4.el7.x86_64
1:cups-client-1.6.3-51.el7.x86_64 is a duplicate with 1:cups-client-1.6.3-35.el7.x86_64
1:cups-libs-1.6.3-51.el7.x86_64 is a duplicate with 1:cups-libs-1.6.3-35.el7.x86_64
curl-7.29.0-59.el7_9.1.x86_64 is a duplicate with curl-7.29.0-46.el7.x86_64
......

解决方法1:使用package-cleanup工具进行清理(不推荐)

package-cleanup工具 简单用法
查看重复的包:package-cleanup --dupes
清理损坏的包:package-cleanup --problems
清理重复的包:package-cleanup --cleandupes

package-cleanup工具在清理重复的包的时候都是清理旧版本包,保留新版本包,但是这里有一个隐患,就是新版本包如果没有安装成功,这时候把旧版本包清理了,会导致不可预测的问题。

遇见有的重复包说无法正常删除的,有依赖,就只能手动删除,删除方法参见 【解决方法2】

解决方法2 使用 rpm -e --justdb --nodeps 包名 删除 (推荐)

使用 rpm -e --justdb --nodeps 包名 命令删除重复包时,会优先删除新版本的包。 详见:https://wiki.centos.org/HowTos/CleaningUpDuplicatePackages

如果重复包很少,就手动复制删除即可, 例如: rpm -e --justdb --nodeps 包1 包2 包3; 这里 包1 包2 包3 指 package-cleanup --dupes 命令输出的具体包名(整行复制包括版本号等)

如果重复包很多,就不适合一个一个去删除了,这时候我们就需要写一个脚本, 用脚本做批量删除即可。

#!/bin/bash

# 将所有的重复包名保存到 rpm.txt 文件中
package-cleanup --dupes > ./rpm.txt

# 文件路径
file_path="./rpm.txt"

# 逐行读取文件
if [ -f "$file_path" ]; then
    while IFS= read -r line; do
        echo "当前要删除的包: $line"
        rpm -e --justdb --nodeps $line
    done < "$file_path"
else
    echo "文件不存在或无法访问。"
fi
  1. 将上面的脚本内容保存到demo.sh文件中(文件名随意)
  2. 然后用 chmod +x demo.sh 给文件赋予可执行权限。
  3. 最后运行脚本 ./demo.sh

这时候就会删除所有的重复包。

后记

本次经历得出一个教训,千万要有耐心,别手欠儿的随意中断linux正在执行的命令。

参考

yum update duplicate problems
解决yum update异常中断产生重复包、依赖冲突等问题
yum update 意外中断,如何解决报错
Cleaning up duplicate packages when yum has failed

posted @ 2023-07-04 15:23  水车  阅读(995)  评论(0编辑  收藏  举报