我在 Ask Ubuntu 上看到很多关于此类错误的问题:
foo post-installation script returned exit status 1
安装后脚本到底是什么?安装后脚本位于哪里?
我碰到这个问题这有点相关,但它讨论的是安装后触发器而不是安装后脚本。
答案1
脚本的名称本身就说明了它的作用。换句话说,该脚本包含安装完成后应执行的命令。
让我们通过一个例子来更好地理解它:
- 假设您正在安装较新的内核。文件安装
.deb
完成后,它需要告诉 GRUB 内核已安装,以便您可以启动它。因此,软件包的后期安装将通过执行命令update-grub
和来告诉 GRUB 内核已安装update-initramfs
。有关更多信息,请参阅常见问题解答部分。
一个更通用的例子是这样的:
假设您正在安装软件包
foo
。现在假设该软件包需要bar
禁用一个名为的服务。它将如何禁用它?开发人员将在软件包的安装后脚本systemctl disable bar.service
中添加禁用该服务的命令foo
。因此,软件包的安装后脚本由以下部分组成:额外的命令、更新等等……安装包括以下步骤:
提取新包的控制文件。
如果在新安装之前安装了同一包的另一个版本,请执行旧包的 prerm 脚本。
如果包提供了,则运行 preinst 脚本。
解压新的文件,同时备份旧的文件,这样如果出现问题可以恢复。
如果在新安装之前安装了同一软件包的另一个版本,请执行旧软件包的 postrm 脚本。请注意,此脚本在新软件包的 preinst 脚本之后执行,因为新文件是在删除旧文件的同时写入的。
配置包。
安装后的操作在“配置包”下进行。它包括:
告知其他应用程序该包已成功安装。
包的精确路径,以便用户和其他应用程序可以使用/执行它。
查找安装中的任何错误并打印错误消息。
常见问题解答部分
这些脚本位于哪里?
这些脚本位于
/var/lib/dpkg/info
。这些脚本有一个.postinst
扩展名。您可以运行locate .postinst
以查找更多此类脚本。示例安装后脚本如下所示:
#!/bin/sh set -e if [ -x /usr/sbin/update-initramfs ]; then /usr/sbin/update-initramfs -u -k all fi
如果安装后脚本返回,这意味着什么
exit status 1
?通常,这意味着安装后脚本返回
exit 1
以指示安装后脚本内的命令由于某种原因失败。我该如何修复
exit status 1
?您可以尝试在 Google 上搜索命令的错误并修复它们。如果您遇到和
apt
/或的错误dpkg
,那么您可以删除安装后脚本并在修复命令后安全地将其移回。但是,这可能并不总是正确的解决方案。您可能需要提出新问题。下表列出了一些用于修复常见安装后脚本错误的有用命令:
我正在询问与这些脚本相关的错误的新问题,我应该提供哪些信息?
您应该提供以下信息:
- 您的 Ubuntu 版本( 的输出
lsb_release -d
)。 - 的输出
sudo apt update
。 - 的完整输出
sudo apt -f install
。 - 包的安装后脚本的内容。
其他详细信息应在询问时提供。
- 您的 Ubuntu 版本( 的输出
我可以更改/删除这些脚本吗?
不!避免弄乱这些脚本。如果存在语法错误或任何命令错误,
apt
则该包的每次安装都会失败。如果碰巧存在任何语法错误,则需要手动使用后端工具来dpkg
修复所有内容。我可以删除它们吗?不!除非必要,否则不要删除它们,删除这些脚本可能会使这些包无法使用。我如何重新执行这些脚本?
想要重新执行软件包的安装后脚本吗?正如我之前所说,运行安装后脚本位于软件包的“配置”下。因此,只需运行:
sudo dpkg --configure <package>
<package>
您要配置的包的名称在哪里。
此剧本的亲朋好友。
尝试运行ls
并/var/lib/dpkg/info
输出grep
带有模式 的输出aptitude
。您会发现很多与其输出类似的脚本。其中一些是.postrm
、.preinst
和prerm
以及 .list
签名文件。下表显示了每个脚本的功能:
脚本 | 功能 |
---|---|
移除后 ( .postrm ) |
该脚本包含在删除完成后运行的命令。 |
预安装 ( .preinst ) |
该脚本包含在安装前要运行的命令。 |
移除前 ( .prerm ) |
该脚本包含在删除过程之前要运行的命令 |
列出文件 ( .list ) |
该文件包含该包所拥有或属于该包的目录列表。 |
更多信息请参阅的手册页dpkg