需要在 rpm 删除/升级之前停止 initv 服务吗?

需要在 rpm 删除/升级之前停止 initv 服务吗?

是否需要停止服务执行服务的 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 会非常有用。

相关内容