dpkg:新的预安装脚本返回错误退出状态 1

Pet*_*i H 9 ubuntu debian dpkg

我最终处理了一个打算使用 dpkg 部署的软件。.deb 包在测试环境中运行良好,但在暂存时失败。两者都运行相同版本的 Ubuntu,但我不是 100% 确定其余的配置。如何进一步调试这个 dpkg 问题?

安装失败是这样的:

sudo dpkg -i --debug=7337 package.deb 
D000010: ensure_pathname_nonexisting `/var/lib/dpkg/tmp.ci'
(Reading database ... 201812 files and directories currently installed.)
Unpacking myProprietarySoftware (from package.deb) ...
D000001: process_archive oldversionstatus=not installed
D000002: fork/exec /var/lib/dpkg/tmp.ci/preinst ( install )
dpkg: error processing package.deb (--install):
 subprocess new pre-installation script returned error exit status 1
D000002: maintainer_script_new nonexistent postrm `/var/lib/dpkg/tmp.ci/postrm'
D000010: ensure_pathname_nonexisting `/var/lib/dpkg/tmp.ci'
D000010: ensure_pathname_nonexisting running rm -rf
D000010: ensure_pathname_nonexisting `/var/lib/dpkg/reassemble.deb'
Errors were encountered while processing:
 package.deb
Run Code Online (Sandbox Code Playgroud)

cas*_*cas 15

由于某种原因,包的 .preinst 脚本失败。

要找出原因,请检查脚本 /var/lib/dpkg/info/PACKAGENAME.preinst

如果您想确切地查看脚本在哪一行失败,请编辑 .preinst 脚本并set -x在该#!行之后立即添加。这将打开脚本中的执行跟踪。

注意:这假设 .preinst 脚本是一个 shell 脚本(posix sh 或 bash)。 几乎所有.preinst(以及 .postinst、.prerm 和 .postrm)脚本都是 shell 脚本,但它们不一定是,它们可以是任何可执行文件。例如,在我安装了 9104 个软件包的主台式机上,14 个是 perl 脚本,1 个是编译后的可执行文件(bash 的 preinst - 它不能假设已经安装了一个正常运行的 shell),其余的都是 shell 脚本...... 9041 是 POSIX shell 脚本,63 是 bash 脚本。如果 .preinst 是 perl 或 python 或其他东西,您将必须弄清楚如何在该语言中启用调试或执行跟踪模式或类似模式。

然后运行dpkg --configure --pending

这会导致 dpkg 尝试配置安装了一半的包。不要用 重新安装它dpkg -i,这会用 .deb 包中的版本覆盖你编辑过的 .preinst 脚本。

这可能会为您提供足够的信息来解决问题。它可能很简单,比如程序中意外或未捕获的退出代码(大多数 .preinst 等脚本都有set -e,以使它们在第一个错误时终止),或者假设目录已经存在(这可能是由于未声明的依赖关系)在包的 debian/control 文件中 - 即它应该依赖于 foo 但不依赖于。无论如何安装 foo)

一旦它被修复,dpkg --configure --pending再次运行,包应该被正确安装。

如果 .preinst 脚本有问题,那么 .postinst(和/或 .prerm 和 .postrm)脚本也很可能有问题。您可能还需要修复它们。

不要忘记向制作软件包的人提交错误报告,以便他们进行修复。


jmt*_*mtd 8

您的打包软件包含一个失败的“预安装脚本”(preinst)。这是嵌入在 .deb 文件中的 shell 脚本。您可以使用以下方法提取它:

 dpkg-deb -e some-deb.deb out-dir
Run Code Online (Sandbox Code Playgroud)

然后你可以查看一下out-dir/preinst,看看你是否能找出它失败的原因。

如果您想修改该脚本并重建.deb(可能添加一些调试代码),请尝试

 dpkg-deb -x some-deb.deb another-out-dir
 dpkg-deb -e some-deb.deb another-out-dir/DEBIAN
 (modify another-out-dir/DEBIAN/preinst)
 dpkg-deb -b another-out-dir some-deb2.deb
Run Code Online (Sandbox Code Playgroud)