前言
事情的起因是执行了 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
- 将上面的脚本内容保存到
demo.sh
文件中(文件名随意) - 然后用
chmod +x demo.sh
给文件赋予可执行权限。 - 最后运行脚本
./demo.sh
这时候就会删除所有的重复包。
后记
本次经历得出一个教训,千万要有耐心,别手欠儿的随意中断linux正在执行的命令。
参考
yum update duplicate problems
解决yum update异常中断产生重复包、依赖冲突等问题
yum update 意外中断,如何解决报错
Cleaning up duplicate packages when yum has failed