已安装软件包时避免出现 yum 错误
Avoid yum error when a package is already installed
我在 Linux 机器上使用 AWS Elastic Beanstalk,需要在 .ebextensions 中安装一些字体:
container_commands:
01_getfont:
command: sudo yum -y install http://somesite.com/rpm/webcore-fonts-3.0-1.noarch.rpm
第一次运行良好,安装了字体。
当我第二次部署 EB 时,它现在给我这个错误:
应用程序更新在 2019-01-28T23:44:14Z 失败,退出状态为 1,错误:container_command 01_getfont in .ebextensions/fonts.config 失败。
Loaded plugins: priorities, update-motd, upgrade-helper
Examining /var/tmp/yum-root-0Yx1DY/webcore-fonts-3.0-1.noarch.rpm: webcore-fonts-3.0-1.noarch
/var/tmp/yum-root-0Yx1DY/webcore-fonts-3.0-1.noarch.rpm: does not update installed package.
Error: Nothing to do.
当该软件包第二次安装在同一个 EC2 实例上时,如何避免出现该错误?
后来我找到了这个问题的答案,为了其他有类似问题的人的利益,把它贴在这里。
我改用重新安装:
sudo yum -y reinstall http://somesite.com/rpm/webcore-fonts-3.0-1.noarch.rpm
这将在第一次和所有其他部署时间都有效。
编辑:
以上方法无效,如果未安装软件包,重新安装将失败。我最终检测包是否已安装,如果没有,请安装它,否则重新安装:
command: sudo yum -q list installed webcore-fonts.noarch &>/dev/null && sudo yum -y reinstall http://somesite.com/rpm/webcore-fonts-3.0-1.noarch.rpm || sudo yum -y install http://somesite.com/rpm/webcore-fonts-3.0-1.noarch.rpm
Yum 可以 return 为并非真正错误的事物提供非零退出状态,从而导致 Elastic Beanstalk 等更高级别的系统认为脚本失败。
特别是,yum 有时会说 "Nothing to do" 退出状态为 1 - 这可能意味着各种各样的事情,但包括已经安装了所需软件包的情况。
我使用 yum 的脚本解决这个问题的方法是:
yum -y install somepackage
if [ $? -ne 1 ]; then # Exit on any any error except 'nothing to do'
exit 0
fi
一种更简单的方法是通过附加 true
或 exit 0
命令来忽略所有错误 - 但是,当无法访问 Yum 存储库或 Yum 已经退出时,这最终会咬你日期元数据等
高级提示
如果您有多个 yum 命令,或需要处理更多错误代码,您可能需要阅读 shell trap
命令,特别是 EXIT
或 ERR
它可以让你在一个地方处理这些情况,并且可能不会因为不需要的错误而退出。有关详细信息,请参阅 this stack。
本地安装的替代方案
有关更多信息,请参阅 this answer,包括安装您下载的 RPM 时的简单替代方法。
使用packages指令:
packages:
rpm:
webcore-fonts: http://somesite.com/rpm/webcore-fonts-3.0-1.noarch.rpm
这将处理未安装和已安装的情况。
我在 Linux 机器上使用 AWS Elastic Beanstalk,需要在 .ebextensions 中安装一些字体:
container_commands:
01_getfont:
command: sudo yum -y install http://somesite.com/rpm/webcore-fonts-3.0-1.noarch.rpm
第一次运行良好,安装了字体。
当我第二次部署 EB 时,它现在给我这个错误:
应用程序更新在 2019-01-28T23:44:14Z 失败,退出状态为 1,错误:container_command 01_getfont in .ebextensions/fonts.config 失败。
Loaded plugins: priorities, update-motd, upgrade-helper
Examining /var/tmp/yum-root-0Yx1DY/webcore-fonts-3.0-1.noarch.rpm: webcore-fonts-3.0-1.noarch
/var/tmp/yum-root-0Yx1DY/webcore-fonts-3.0-1.noarch.rpm: does not update installed package.
Error: Nothing to do.
当该软件包第二次安装在同一个 EC2 实例上时,如何避免出现该错误?
后来我找到了这个问题的答案,为了其他有类似问题的人的利益,把它贴在这里。
我改用重新安装:
sudo yum -y reinstall http://somesite.com/rpm/webcore-fonts-3.0-1.noarch.rpm
这将在第一次和所有其他部署时间都有效。
编辑:
以上方法无效,如果未安装软件包,重新安装将失败。我最终检测包是否已安装,如果没有,请安装它,否则重新安装:
command: sudo yum -q list installed webcore-fonts.noarch &>/dev/null && sudo yum -y reinstall http://somesite.com/rpm/webcore-fonts-3.0-1.noarch.rpm || sudo yum -y install http://somesite.com/rpm/webcore-fonts-3.0-1.noarch.rpm
Yum 可以 return 为并非真正错误的事物提供非零退出状态,从而导致 Elastic Beanstalk 等更高级别的系统认为脚本失败。
特别是,yum 有时会说 "Nothing to do" 退出状态为 1 - 这可能意味着各种各样的事情,但包括已经安装了所需软件包的情况。
我使用 yum 的脚本解决这个问题的方法是:
yum -y install somepackage
if [ $? -ne 1 ]; then # Exit on any any error except 'nothing to do'
exit 0
fi
一种更简单的方法是通过附加 true
或 exit 0
命令来忽略所有错误 - 但是,当无法访问 Yum 存储库或 Yum 已经退出时,这最终会咬你日期元数据等
高级提示
如果您有多个 yum 命令,或需要处理更多错误代码,您可能需要阅读 shell trap
命令,特别是 EXIT
或 ERR
它可以让你在一个地方处理这些情况,并且可能不会因为不需要的错误而退出。有关详细信息,请参阅 this stack。
本地安装的替代方案
有关更多信息,请参阅 this answer,包括安装您下载的 RPM 时的简单替代方法。
使用packages指令:
packages:
rpm:
webcore-fonts: http://somesite.com/rpm/webcore-fonts-3.0-1.noarch.rpm
这将处理未安装和已安装的情况。