spec文件中的 %pre %post %preun %postun
转载 http://meinit.nl/rpm-spec-prepostpreunpostun-argument-values
RPM has 4 parts where (shell) scripts can be used:
- %pre - Executed before installation.
- %preun - Executed before un-installation.
- %post - Executed after installation.
- %postun - Executed after un-installation.
In all these parts or sections the variable "$1" can be checked to see what's being done:
- Initial installation
- Upgrade
- Un-installation
This table show the values of "$1" per section related to the action.
| %pre | %preun | %post | %postun | |
| Initial installation | 1 | not applicable | 1 | not applicable |
| Upgrade | 2 | 1 | 2 | 1 |
| Un-installation | not applicable | 0 | not applicable | 0 |
This can be used for example when registering new services:
%post case "$1" in 1) # This is an initial install. chkconfig --add newservice ;; 2) # This is an upgrade. # First delete the registered service. chkconfig --del newservice # Then add the registered service. In case run levels changed in the init script, the service will be correctly re-added. chkconfig --add newservice ;; esac %preun case "$1" in 0) # This is an un-installation. service newservice stop chkconfig --del newservice ;; 1) # This is an upgrade. # Do nothing. : ;; esac
Good to know; this is the order for certain RPM actions:
| install | upgrade | un-install |
| %pre ($1=1) | %pre ($1=2) | %preun ($1=0) |
| copy files | copy files | remove files |
| %post ($1=1) | %post ($1=2) | %postun ($1=0) |
| %preun ($1=1) from old RPM. | ||
| delete files only found in old package | ||
| %postun ($1=1) from old RPM. |
So when upgrading the exemplary package "software" from version 1 to version 2, this is the script (%post and %postun) order:
- 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".
This means there are cases where "software-1" has incorrect scripts, and there is no way to upgrade. In that case the RPM can be uninstalled, which might execute different commands because $1 equals 0 (un-install) instead of 1 (upgrade).
When the RPM uninstall scripts fail, the only way to fix things is to manually execute the intended commands... RPM is not perfect, but it's pretty well thought through!

浙公网安备 33010602011771号