如何为Python程序的Debian软件包添加卸载清理脚本
如何为Debian软件包添加卸载清理脚本?
很高兴你已经搞定了postinst脚本的配置,现在要加卸载清理的话,Debian包体系里有专门的维护脚本来处理这类操作,最常用的是postrm(包被彻底移除后执行)和prerm(包移除前执行)。下面一步步教你整合:
1. 选择合适的维护脚本
- 如果你的清理操作需要在包完全被移除(比如执行
apt purge)后才做(比如删除数据库、配置文件),用postrm脚本。 - 如果需要在包开始移除前执行(比如停止关联的服务),用
prerm脚本。
这里我们以postrm为例,因为你要清理环境,适合在彻底卸载后执行。
2. 创建并编写postrm脚本
在你的Debian包构建目录的debian子目录下,创建一个名为postrm的文件,内容示例如下:
#!/bin/sh set -e # 根据dpkg传递的参数执行不同逻辑 case "$1" in # 当执行apt purge时触发(彻底清除包及配置) purge) # 清理MySQL数据表/用户(根据你的实际情况修改) # 注意:如果你的MySQL root用户需要密码,这里要处理免密登录,比如用.my.cnf配置 mysql -u root -e "DROP DATABASE IF EXISTS mypackage_db; DROP USER IF EXISTS 'mypackage_user'@'localhost';" # 清理其他环境:比如配置目录、日志目录 rm -rf /etc/mypackage rm -rf /var/log/mypackage echo "Mypackage环境已清理完成" ;; # 以下情况不需要执行清理逻辑(比如apt remove只删除包文件保留配置,或者升级) remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) : # 空操作,什么都不做 ;; *) echo "未知参数: $1" >&2 exit 1 ;; esac exit 0
关键注意点:
- 脚本开头必须是
#!/bin/sh,Debian的维护脚本默认用POSIX shell。 - 加上
set -e可以让脚本在出错时立即退出,避免后续错误操作;如果有些步骤允许失败,可以用command || true来忽略错误。 - 处理MySQL密码:如果你的root用户有密码,不要在脚本里明文写密码,建议在postinst脚本中配置
/root/.my.cnf文件(设置mysql客户端默认登录参数),这样postrm里的mysql命令就能免密执行。比如.my.cnf内容:
记得给这个文件设置权限[mysql] user=root password=your_root_passwordchmod 600 /root/.my.cnf,避免泄露密码。
3. 给脚本添加执行权限
运行命令给postrm脚本加上可执行权限,否则dpkg无法调用它:
chmod +x debian/postrm
4. 重新构建软件包
用你之前的构建命令重新打包(比如dpkg-deb --build mypackage或者用debhelper的dpkg-buildpackage),新的deb包就包含了卸载清理脚本。
5. 测试卸载流程
安装新包后,执行彻底卸载命令测试:
sudo apt purge mypackage
执行完成后,检查MySQL数据库是否被删除,配置文件是否清理干净,确认脚本生效。
如果需要在移除包前执行操作(比如停止你的Python服务),可以用prerm脚本,逻辑和postrm类似,只是case里的参数触发时机不同。比如在prerm的remove或purge分支里添加停止服务的命令。
内容的提问来源于stack exchange,提问作者Waqas




