在执行服务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".在这种情况下,在安装新包之前,不应该在%预置中停止服务吗?
以下是我的部分规格文件供参考:
%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中先停止服务的情况下,这是可行的。
发布于 2018-03-15 23:19:18
您已经忘记了UNIX文件系统是如何工作的。只要链接加载器保持对象文件处于打开状态,进程就会看到它启动时使用的对象文件,因为它持有现在删除的文件的句柄。一旦这个句柄被关闭()ed,那么文件实际上就被删除了。因此,在删除和安装新的对象文件时,保持守护进程运行是安全的。
当然,运行的是守护进程的旧版本,所以如果升级是为了解决安全问题,那么“安全”就不那么安全了。这就是为什么Debian的APT有不同的策略,在升级时停止/启动守护进程。
如果您想要更改包的策略,您可能会发现RPM上的规格说明很有用。
https://unix.stackexchange.com/questions/430461
复制相似问题