如何在子进程安装后调试dpkg configure error?

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

dpkg: error processing spamassassin (--configure): subprocess installed post-installation script returned error exit status 1 

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

在/ var / crash中生成了spamassassin crashreport,但这只会产生旧的dpkg错误,并且:

  Start-Date: 2014-02-17 19:18:13 Commandline: apt-get install spamassassin AptOrdering: spamassassin: Configure amavisd-new-postfix: Configure 

接下来是启动时的dmesg日志记录。 Amavis发出错误,因为未配置依赖spamassassin。

我检查了日志文件:

 apt history.log apt term.log dpkg.log syslog.log 

但没有其他信息。

我尝试了所有可能的octals的dpkg -D但我发现什么可能出错没什么用。

关于dpkg错误已经写了很多问题和可能的解决方案,而且我已经尝试了很多,但是没有其他信息我没有感觉我到处都是。

当然必须有某种可能性来读取出现问题或者记录一些日志记录以便记录下来?

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

 dpkg: error processing spamassassin (--configure): subprocess installed post-installation script returned error exit status 1 

说运行configure时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。 使用/ bin / false返回没有任何消息但是退出1。

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

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

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

但是,它可能需要至少一些shell脚本编写技能才能进行调试。