升级特定包后如何运行脚本?

Flu*_*Shy 7 apt

我为一个应用程序创建了一个 systemd 服务,因为它不包含一个服务,我希望能够在更新包时重新启动相关的服务。

我怎样才能做到这一点?

mur*_*uru 7

AFAIK apt 没有特定于包的钩子(即,当给定的包被修改时,无法告诉它运行命令)。它所具有的是DPkg::Pre-Install-Pkgs

Pre-Install-Pkgs
   This is a list of shell commands to run before invoking dpkg(1).
   Like options this must be specified in list notation. The commands
   are invoked in order using /bin/sh; should any fail APT will abort.
Run Code Online (Sandbox Code Playgroud)

请注意,这是在运行之前对包完成任何操作的。

您可以为通过 stdin 传递给命令的信息指定一个版本;信息水平随着版本的增加而增加:

  • 版本 1 只是将路径发送到正在安装的包文件
  • 版本 2 另外转储

    • VERSION 2 作为第一行,然后
    • 当前的 Apt 配置,后跟一个空行

    对于每个包裹,

    • 操作前后包的版本,
    • 以及操作本身,因此,与版本 2 不同,
  • 除了 (2) 中的信息之外,版本 3 还添加了架构信息(并VERSION 3作为第一行)

对于一个简单的情况,你可以有一个像 (in, say /usr/local/bin/restart-foo)这样的脚本:

Pre-Install-Pkgs
   This is a list of shell commands to run before invoking dpkg(1).
   Like options this must be specified in list notation. The commands
   are invoked in order using /bin/sh; should any fail APT will abort.
Run Code Online (Sandbox Code Playgroud)

和 apt 配置/etc/apt/apt.conf.d/99-foo-hook

DPkg::Pre-Install-Pkgs {"/usr/local/bin/restart-foo";};
DPkg::Tools::Options::/usr/local/bin/restart-foo::Version "1";
Run Code Online (Sandbox Code Playgroud)

对于更复杂的情况,您可以通过设置DPkg::Tools::Options::/usr/local/bin/restart-foo::Version"2"or来请求更多信息并解析它"3",如下所示:

#! /bin/bash

if grep -q my-package
then
    # schedule an at job to restart it
    at now + 30 min <<<"service restart foo"
fi
Run Code Online (Sandbox Code Playgroud)

当然,不是echoing 数据,而是使用它来决定要做什么。

提供的输入示例:

V1:

/var/cache/apt/archives/tcsh_6.18.01-5_amd64.deb
Run Code Online (Sandbox Code Playgroud)

V2:

VERSION 2
APT::Architecture=amd64
APT::Build-Essential::=build-essential
APT::Install-Recommends=true
[...]
DPkg::Progress-Fancy=1
Binary=apt
CommandLine::AsString=apt%20install%20--reinstall%20tcsh

tcsh - < 6.18.01-5 /var/cache/apt/archives/tcsh_6.18.01-5_amd64.deb
tcsh - < 6.18.01-5 **CONFIGURE**
Run Code Online (Sandbox Code Playgroud)

版本 3:

VERSION 3
APT::Architecture=amd64
APT::Build-Essential::=build-essential
APT::Install-Recommends=true
[...]
DPkg::Progress-Fancy=1
Binary=apt
CommandLine::AsString=apt%20install%20--reinstall%20tcsh
tcsh 6.18.01-5 amd64 none = 6.18.01-5 amd64 none /var/cache/apt/archives/tcsh_6.18.01-5_amd64.deb
tcsh 6.18.01-5 amd64 none = 6.18.01-5 amd64 none **CONFIGURE**
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用 dpkg 触发器。但是,为此,您需要创建一个包,该包为您要观看的包中的某些内容安装触发器,但触发器在配置包后执行,因此这对重新启动服务更好。这个Stack Overflow 帖子有一个很好的指南。