如何修复"另一个应用程序当前持有yum锁"错误
如果我们使用的是Linux环境,那么运营商中必须有一次出现以下错误:"另一个应用程序当前持有yum锁"或者"Existing lock/var/run"/Yum.pid:另一个副本在执行yum时作为pid XXX运行。
another app is currently holding the yum lock
Existing lock /var/run/yum.pid: another copy is running as pid XXX
现在,这个错误"另一个应用程序当前持有yum锁"主要出现在较旧的yum版本中,尤其是YUMv3,它是RHEL/CentOS 6的一部分,还有一些版本的RHEL/CentOS 7. 现在有了RHEL7.7,Red Hat已经迁移到YUMv4. 我们将在本文后面部分讨论这个变化。
现在,让我们看看如何克服和修复"另一个应用程序当前持有yum锁定"错误。在本文中,我使用RHEL/centos7在不同的终端上运行了两个并行的yum会话,手动模拟了这个错误。
方法1:终止锁定进程以修复"另一个应用程序当前持有yum锁"
现在很明显,另一个yum会话正在进行中,这就是为什么不允许运行yum会话并等待另一个会话退出的原因。现在,在其他yum进程退出之前,yum进程将继续抛出"另一个应用程序当前持有yum锁",如下所示:
# yum install sntp.x86_64 Loaded plugins: fastestmirror Existing lock /var/run/yum.pid: another copy is running as pid 9571. Another app is currently holding the yum lock; waiting for it to exit... The other application is: yum Memory : 86 M RSS (408 MB VSZ) Started: Thu Nov 6 20:44:53 2017 - 00:35 ago State : Sleeping, pid: 9571 Another app is currently holding the yum lock; waiting for it to exit... The other application is: yum Memory : 86 M RSS (408 MB VSZ) Started: Thu Nov 6 20:44:53 2017 - 00:37 ago State : Sleeping, pid: 9571
现在,输出本身表示另一个进程的PID,该进程使用/var/run/Yum.pid
也可以手动查看此文件的内容,以获取其他yum进程的PID
提示:
每次执行yum时,它都会创建/var/run/Yum.pid
文件,并在此文件中添加进程的PID。
# cat /var/run/yum.pid 9571
所以我们知道有一个进程带有PID9571
锁定。要获得有关此过程的详细信息,可以使用"ps"。下面的命令将告诉我们有关使用PID 9571的命令
# ps -p 9571 PID TTY TIME CMD 9571 pts/1 00:00:03 yum
要获得更多细节,我们可以使用"ps-ef",如下所示
# ps -ef | grep 9571 root 9571 9498 4 20:44 pts/1 00:00:03 /usr/bin/python /usr/bin/yum install nagios-plugins-ntp.x86_64 root 9576 9477 0 20:46 pts/0 00:00:00 grep --color=auto 9571
因此,yum的另一个会话是安装"nagios plugins ntp",从而创建锁文件。
因此,我们可以等待该进程完成,也可以手动终止该进程
警告:
在生产环境中不建议这样做,因为这样可能会使Linux节点处于不可用状态。建议让另一个进程完成。
# kill -9 9571
现在还可能有其他一些进程正在使用yum,例如与RHEL/CentOS 6/7一起使用的"PackageKit",这可能会使锁保留更长的时间,因此根据要求,我们可以选择禁用此服务
永久停止并禁用CentOS/RHEL 7上的"PackageKit"
# systemctl disable packagekit --now
要在CentOS/RHEL 6上永久禁用"PackageKit",请打开下面的文件并将"enabled=1"更改为"enabled=0"`
# vi /etc/yum/pluginconf.d/refresh-packagekit.conf enabled=0
方法二:用DNF代替YUM
对于CentOS/rhel7,我们有一个备用工具"dnf"作为包管理器。我们必须明白,dnf有一些重大改进,不应被视为与yum相同。
因此,如果yum抛出"另一个应用程序当前持有yum锁",那么我们可以使用dnf作为替代方法。但这需要在环境中安装dnf rpm,默认情况下,RHEL/CentOS 7中不会安装dnf rpm。
说明:
在RHEL系统上,我们必须具有对RHN的活动订阅,或者我们可以配置本地脱机存储库,使用该存储库,"yum"包管理器可以安装提供的rpm及其依赖项。
# yum install dnf
下一步,我们可以完全切换到"dnf",但由于某种原因,如果团队中仍有人使用yum,而我们得到"另一个应用程序当前持有yum锁"错误,则可以开始使用"dnf"包管理器。
如下所示,两者可以并行运行:
# ps -ef | egrep yum\|dnf | grep -v grep root 9626 9498 2 20:59 pts/1 00:00:03 /usr/bin/python /usr/bin/yum install nagios-plugins-ntp.x86_64 root 9628 9477 36 21:00 pts/0 00:00:35 /usr/bin/python2 /usr/bin/dnf install sntp.x86_64
Yumvs DNF
既然我们正在讨论这个话题,让我们对Yum和DNF做一些简单的比较
RHEL/CentOS 8引入了YUMv4
# rpm -q yum yum-4.2.7-7.el8_1.noarch
尽管这将在内部与DNFv3相连。
# ls -l /usr/bin/yum lrwxrwxrwx 1 root root 5 Dec 19 21:13 /usr/bin/yum -> dnf-3
与Red Hat Enterprise Linux 7上使用的以前的"YUMv3"相比,YUMv4具有以下优势:
性能提高
提供了新功能,最重要的是支持管理模块化内容
设计良好的稳定API,用于与工具集成
与Yum相比,DNF还有其他各种变化
使用"dnf",我们将永远不会遇到"另一个应用程序当前持有yum锁",因为"dnf"不依赖任何此类PID文件,并且可以并行执行"dnf"的多个实例。
虽然如果我们选择使用YUMv4,我们可能仍然会得到"Waiting for process with pid XXXX to finish."如果另一个yum进程正在运行,但使用YUMv4的处理效果要远远好于YUMv3