什么是软件包的安装后脚本?

Err*_*404 9 package-management dpkg deb

我在 Ask Ubuntu 上看到了很多关于这样的错误的问题:

foo post-installation script returned exit status 1
Run Code Online (Sandbox Code Playgroud)

到底什么是安装后脚本?安装后脚本位于哪里?

我遇到了这个有点相关的问题,但它讨论的是安装后触发器而不是安装后脚本。

Err*_*404 17

脚本的名称本身就说明了它的作用。换句话说,该脚本包含安装完成后应执行的命令。

让我们通过一个例子更好地理解它:

  • 假设您正在安装更新的内核。文件安装.deb完成后,它需要告诉 GRUB 内核已安装,以便您可以引导到它。update-grub因此,包的安装后将通过执行命令和来告诉 GRUB 内核已安装update-initramfs。有关更多信息,请参阅常见问题解答部分。

一个更通用的例子可以是这样的:

  • 假设您正在安装该软件包foo。现在假设该包需要一个被bar调用的服务来禁用。它将如何禁用它?开发人员将在软件包的安装后脚本中添加命令systemctl disable bar.service,该命令将禁用该服务。foo因此,该软件包的安装后脚本包含附加命令、更新等......

    安装包括以下步骤:

    1. 提取新包的控制文件。

    2. 如果在新安装之前安装了同一软件包的另一个版本,请执行旧软件包的 prerm 脚本。

    3. 运行 preinst 脚本(如果包提供)。

    4. 解压新文件,同时备份旧文件,以便出现问题时可以恢复。

    5. 如果在新安装之前安装了同一软件包的另一个版本,请执行旧软件包的 postrm 脚本。请注意,该脚本在新包的 preinst 脚本之后执行,因为新文件是在旧文件被删除的同时写入的。

    6. 配置包。

安装后位于“配置包”下。它包括:

  1. 告诉其他应用程序包安装成功。

  2. 包的精确路径,以便用户和其他应用程序可以使用/执行它。

  3. 查找安装中的任何错误并打印错误消息。


常见问题解答部分


  • 这些脚本位于哪里?

    这些脚本位于/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
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果安装后脚本返回 ,这意味着什么exit status 1

    通常,这意味着安装后脚本返回exit 1以指示安装后脚本内的命令由于某种原因失败。

  • 我该如何修复exit status 1

    您可以尝试使用命令搜索错误并修复它们。如果您遇到apt和/或错误dpkg,那么您可以删除安装后脚本,并在修复命令后安全地将其移回原处。然而,这可能并不总是正确的解决方案。您可能想问一个新问题

    下表提到了一些用于修复常见安装后脚本错误的有用命令:

    命令 描述 有力 句法
    apt purge 删除包及其配置文件。 视情况而定。 sudo apt purge <package_name>
    dpkg -r 用力移除包裹。提供了很多有用的论据。 是的,与某些参数一起使用时 sudo dpkg -r --force-all <package_name>
    dpkg -P 强力清除包。提供了很多有用的论据。 是的,当与某些参数一起使用时。 sudo dpkg -P --force-all <package_name>
  • 我提出一个关于与这些脚本相关的错误的新问题,我应该提供哪些信息?

    您应该提供以下信息:

    • 您的 Ubuntu 版本( 的输出lsb_release -d)。
    • 的输出sudo apt update
    • 完整输出sudo apt -f install.
    • 包的安装后脚本的内容。

    其他详细信息应在询问时提供。

  • 我可以更改/删除这些脚本吗?

    没有!避免弄乱这些脚本。如果存在语法错误或任何命令错误,则apt该软件包的每次安装都会失败。如果偶然出现任何语法错误,那么您需要手动使用后端工具dpkg来修复所有内容。我可以删除它们吗?不!除非必要,否则不要删除它们,删除这些脚本可能会使这些包无法使用。

  • 我如何重新执行这些脚本?

    想要重新执行软件包的安装后脚本吗?正如我之前所说,运行安装后脚本位于包的“配置”下。所以,简单运行:

    sudo dpkg --configure <package>
    
    Run Code Online (Sandbox Code Playgroud)

    其中<package>是您要配置的包的名称。


这个脚本的朋友和亲戚。

尝试ls使用模式运行/var/lib/dpkg/info并输出。您会发现许多类似的脚本作为其输出。其中一些是、、以及 签名文件。下表显示了每个脚本的功能:grepaptitude.postrm.preinstprerm.list

脚本 功能
删除后 ( .postrm) 该脚本包含删除完成后运行的命令。
预安装 ( .preinst) 该脚本由安装前运行的命令组成。
预移除 ( .prerm) 该脚本包含在删除过程之前运行的命令
列出文件 ( .list) 该文件包含该包拥有/属于的目录列表。

有关更多信息,请参阅联机帮助页dpkg