包的安装后脚本是什么?

包的安装后脚本是什么?

我在 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。因此,软件包的安装后脚本由以下部分组成:额外的命令、更新等等……

    安装包括以下步骤:

    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
    
  • 如果安装后脚本返回,这意味着什么exit status 1

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

  • 我该如何修复exit status 1

    您可以尝试在 Google 上搜索命令的错误并修复它们。如果您遇到和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>
    

    <package>您要配置的包的名称在哪里。


此剧本的亲朋好友。

尝试运行ls/var/lib/dpkg/info输出grep带有模式 的输出aptitude。您会发现很多与其输出类似的脚本。其中一些是.postrm.preinstprerm以及 .list签名文件。下表显示了每个脚本的功能:

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

更多信息请参阅的手册页dpkg

相关内容