在一些 Centos VM 上,我需要删除一些 MySQL 软件包(通过 yum),然后安装 MariaDB(通过 rpm),所有这些都在 shell 脚本中。我使用 yum 进行删除:
yum remove -y mysql-community-client
yum remove -y mysql-community-release
yum remove -y mysql-community-libs
yum remove -y mysql-community-common
现在,在某些虚拟机上,可能未安装客户端软件包,因此 yum 会显示:
No Match for argument: mysql-community-client
Determining fastest mirrors
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os&infra=stock error was
14: PYCURL ERROR 7 - "couldn't connect to host"
我知道连接失败是因为我们的防火墙之类的。
我的问题是:
可以告诉 yum 忽略丢失的包吗?
或者至少只是简单地失败No Match for argument
,而不连接到镜像等?
问题标题指的是这样一个事实,yum remove -y mysql-community-client
后面跟着yum remove -y mysql-community-client
将使其连接到镜像,而我希望它说“程序包已卸载”,然后是“程序包已卸载”。
重新表述问题:问题不在于 RPM(我只是为了问题的完整性才提到这一点),问题在于 yum。yum remove X
如果安装了 X,将会删除它。如果没有安装,它会在我想避免的镜像中搜索。我想让 yum 说“X 未安装”并退出。
答案1
我们可以长时间讨论 yum 如何表现或应该表现,但长话短说:
yum --cacheonly remove -y mysql-community-client
可能是你想要的。
答案2
如果我理解正确的话,您想要阻止网络访问、禁用插件并仅卸载mysql-community
当前安装的那些软件包。那么怎么样
yum --disablerepo="*" --noplugins remove "*mysql-community*" -y
并且只会匹配与 glob 匹配的任何已安装的软件包"*mysql-community*"
。虽然一般来说我个人不会将-y
flag 与 一起使用remove
。
如果您只想选择性地卸载已安装的特定软件包,那么托马斯的回答正是您所需要的。
答案3
如果您使用而不是从 yum 存储库安装软件包rpm
,则 yum 将不知道如何确定 rpm 何时被删除,因为没有相关的存储库可供参考。所以其中一部分(MariaDB)不能成为幂等的。
如果您想让脚本幂等,更好的方法是使用rpm -q
给定的包来确定它是否已安装,并使用该结果来决定是否运行 yum。
如果您用于rpm
安装软件包,yum
不会立即注意到,但当您要求它更新系统时会警告您 RPM 数据库安装在 yum 之外。因此,您应该yum install
从 RPM 集中安装 MariaDB 软件包。