如何在安装后的子进程中调试 dpkg 配置错误?

Req*_*ist 22 dpkg

简而言之:我正在尝试安装 spamassassin,但 dpkg 仅返回:

dpkg: error processing spamassassin (--configure):
subprocess installed post-installation script returned error exit status 1
Run Code Online (Sandbox Code Playgroud)

我试图找到有关出了什么问题的更多信息,但我找不到任何有用的日志记录。

在 /var/crash 中生成了 spamassassin 崩溃报告,但这只会给出旧的 dpkg 错误和:

 Start-Date: 2014-02-17  19:18:13
 Commandline: apt-get install spamassassin
AptOrdering:
 spamassassin: Configure
 amavisd-new-postfix: Configure
Run Code Online (Sandbox Code Playgroud)

其次是启动时的 dmesg 日志记录。Amavis 报错,因为没有配置依赖 spamassassin。

我检查了日志文件:

apt history.log
apt term.log
dpkg.log
syslog.log
Run Code Online (Sandbox Code Playgroud)

但没有额外的信息。

我尝试了 dpkg -D 与所有可能的八进制,但我发现可能出错的地方没有任何用处。

已经写了很多关于 dpkg 错误的问题和可能的解决方案,而且我已经尝试了很多,但是没有额外的信息,我感觉不到任何地方。

当然,一定有可能在某个地方读取出错的地方或启动一些日志记录以便将其记录下来?

Req*_*ist 20

好的,我已经找到了这个问题的解决方案。以为我无法启动日志记录以获取更多数据,但已经提供的数据已经提供了问题的线索。

dpkg: error processing spamassassin (--configure):
subprocess installed post-installation script returned error exit status 1
Run Code Online (Sandbox Code Playgroud)

说 dpkg 在运行配置时遇到处理 spamassassin 的错误。下一行告诉我们安装后脚本没有正确完成。

/var/lib/dpkg/info目录中,我们可以找到 dpkg 的脚本文件,文件:spamassassin.postinst为我们提供了产生错误的脚本文件。

在这个文件中,我们知道我们必须查看 configure 运行的代码:

if [ "$1" = "configure" ]; 然后

经过一些调试后,我发现了这一行:

su debian-spamd -c "sa-update --gpghomedir /var/lib/spamassassin/sa-update-keys \ --import /usr/share/spamassassin/GPG.KEY"

返回退出代码 1(运行命令 @commandline 并使用 echo $? next 获取退出代码)

问题是我的系统上已经存在用户 debian-spamd,但它的登录 shell 是 /bin/false。Su-ing with /bin/false 返回没有任何消息,但退出代码 1。

在命令中添加-s /bin/sh解决了这个问题,尽管最后我确实改变了用户的登录 shell 以与未来的更新保持同步。


Mat*_*lis 13

通常要调试此类问题,您可以编辑/var/lib/dpkg/info/spamassassin.postinst(或.preinst、 pr.prerm.postrm; 取决于哪个失败)并#!/bin/sh在顶行更改为#!/bin/sh -x(如果bash改为,则相同:只需添加-x

这将为您提供 shell 脚本的逐行调试,因此您可以使用非零代码判断它退出的位置(导致安装/升级失败)。

不过,它可能至少需要一些 shell 脚本技能来调试。