我正在处理近 30 个包并安装了各种各样的文件和脚本。
其中一些脚本可以在软件包安装时运行,但一旦被删除(而不是清除),它们就不应再执行。
在标准 Ubuntu/Debian 软件包中是如何管理的?
例如,我有一个使用以下命令安装的 logrotate 文件:
/var/log/snapwebsites/snapmanagerdaemon.log {
weekly
maxsize 10M
su snapwebsites snapwebsites
missingok
rotate 10
postrotate
/usr/bin/snapsignal snapmanagerdaemon/LOG
endscript
compress
delaycompress
notifempty
create 640 snapwebsites snapwebsites
}
如果所有包都被删除,二进制/usr/bin/snapsignal
文件就会消失,但这个 logrotate 脚本会保留在原处...因此,当它运行时,一次调用就会失败。
我认为我可以在 postrm 脚本中执行删除操作,如下所示:
if [ "$1" = "remove" ]
then
rm -f /etc/logrotate.d/snapmanagerdaemon
fi
这对于删除步骤有效,但如果用户重新安装包,它就不会回来(它不会被解压)。因此,我不会得到预期的日志轮换。至少在我强制提取该文件并手动重新安装之前不会。
我看到了几种解决方案,但我想知道如何在适当的 Debian 包中完成它。
一个可行的解决方案是让我添加一个测试来了解是否snapsignal
仍然安装。
postrotate
if test -x /usr/bin/snapsignal
then
/usr/bin/snapsignal snapmanagerdaemon/LOG
fi
endscript
只是这意味着即使该包消失了,logrotate 仍会继续运行此条目。我对我管理的其他脚本也有类似的感觉。一旦删除了该包,就没有必要再运行这样的脚本了。
请注意,logrotate 是显示该问题的一个示例。我们实际上在 dpkg 中注意到了这个问题配置文件,我们将脚本放在下面:
/etc/dpkg/dpkg.conf.d/...
移除后仍留在原处。
另一种会留下来并会导致问题的脚本是 CRON 文件。您安装在 、 等目录下的脚本/etc/cron.daily
。/etc/cron.monthly
如果这些脚本中的任何一个在删除后尝试访问您的某个二进制文件,它都会失败。
答案1
在其他人的帮助下,我在 Debian 政策文档中找到了答案,但这仅在CRON 作业部分(与有关此类脚本的更通用的部分相反。)
涉案段落:
这些目录中的脚本或 crontab 条目应在尝试执行所有必需程序之前检查它们是否已安装。否则,当删除包但未清除包时将出现问题,因为在这种情况下配置文件会保留在系统中。