是否需要停止服务前执行服务的 RPM 包的删除或升级?
通常,RPM 包管理器在执行升级时会先安装新包,然后删除旧包。摘抄:
Run %pre from "software-2".
Place files from "software-2".
Run %post from "software-2".
Run %preun from "software-1".
Delete files unique to "software-1".
Run %postun from "software-1".
在这种情况下,在安装新包之前不应该在 %pre 停止服务吗?
这是我的规范文件的一部分供参考:
%preun
# do not run if this is an upgrade
if [ $1 -eq 0 ]; then
/sbin/service myservice stop > /dev/null 2>&1
/sbin/chkconfig --del /etc/init.d/myservice
fi
exit 0
%post
/sbin/chkconfig --add /etc/init.d/myservice
exit 0
我所拥有的是每个人似乎都在做的事情,我不明白为什么这在升级的情况下会起作用,而无需先在 %pre 中停止服务。
答案1
您已经忘记了 UNIX 文件系统是如何工作的。只要链接加载器保持对象文件打开,进程就会看到它启动时使用的对象文件,因为它持有现在已删除的文件的句柄。一旦该句柄被 close()ed,那么该文件实际上被删除。因此,在删除和安装新对象文件时,让守护进程保持运行是安全的。
当然,运行的是旧版本的守护进程,因此如果升级是为了解决安全问题,那么“安全”并不那么安全。这就是为什么 Debian 的 APT 有不同的策略并在升级时停止/启动守护进程。
你可能会发现这个规格如果您想更改软件包的策略,RPM scriptlet 会非常有用。