Rpm
需要在 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 中停止服務。
您已經忘記了 UNIX 文件系統是如何工作的。只要連結載入器讓目標文件保持打開狀態,那麼程序就會看到它開始使用的目標文件,因為它擁有一個指向現在刪除的文件的句柄。一旦該句柄被關閉(),則該文件實際上被刪除。因此,在刪除和安裝新目標文件時讓守護程序執行是安全的。
當然,執行的是舊版本的守護程序,所以如果升級是為了解決安全問題,“安全”就不是那麼安全了。這就是為什麼 Debian 的 APT 有不同的策略並在升級時停止/啟動守護程序。
如果你想改變你的包的策略,你可能會發現這個關於 RPM scriptlet 的規範很有用。