如何修复"另一个应用程序当前持有yum锁"错误

时间:2020-01-09 10:37:07  来源:igfitidea点击:

如果我们使用的是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