删除软件包时忽略该软件包安装的系统脚本的正确方法是什么?

删除软件包时忽略该软件包安装的系统脚本的正确方法是什么?

我正在处理近 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 条目应在尝试执行所有必需程序之前检查它们是否已安装。否则,当删除包但未清除包时将出现问题,因为在这种情况下配置文件会保留在系统中。

相关内容