Rpm

需要在 rpm 刪除/升級之前停止 initv 服務?

  • March 15, 2018

在執行服務的 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 中停止服務。

您已經忘記了 UNIX 文件系統是如何工作的。只要連結載入器讓目標文件保持打開狀態,那麼程序就會看到它開始使用的目標文件,因為它擁有一個指向現在刪除的文件的句柄。一旦該句柄被關閉(),則該文件實際上被刪除。因此,在刪除和安裝新目標文件時讓守護程序執行是安全的。

當然,執行的是舊版本的守護程序,所以如果升級是為了解決安全問題,“安全”就不是那麼安全了。這就是為什麼 Debian 的 APT 有不同的策略並在升級時停止/啟動守護程序。

如果你想改變你的包的策略,你可能會發現這個關於 RPM scriptlet 的規範很有用。

引用自:https://unix.stackexchange.com/questions/430461