包更新时运行脚本?

包更新时运行脚本?

我正在使用 runit 来管理我的服务,当安装新版本的 nginx 时,我想使用sv restart nginx.

有没有一种方法可以监视一个包或一组包的升级并在升级时触发脚本?

答案1

由于您使用的是 Debian,因此一种可能的方法是使用 apts 内置机制。 Apt 可以配置为在更新时运行脚本。

例如,参见 package apt-listchanges,它“是一个工具,用于显示新版本的 Debian 软件包与系统上当前安装的版本相比发生了什么变化”,具体来说,是通过显示新的变更日志条目。该软件包包含脚本/etc/apt/apt.conf.d/20listchanges,该脚本易于在更新时运行。该脚本的全部内容是。

DPkg::Pre-Install-Pkgs { "/usr/bin/apt-listchanges --apt || test $? -ne 10"; };
DPkg::Tools::Options::/usr/bin/apt-listchanges::Version "2";

这些脚本通常使用 apt 的 Perl 或 Python 绑定。/usr/bin/apt-listchanges是一个 Python 脚本并使用 Python 绑定。

例如,请参阅 Debian Wiki 上有些粗略的文档, 会议会议

答案2

你(们)能做到dpkg在包管理操作之前或之后运行命令。通过选项或;该命令是在环境变量设置为操作性质的情况下执行的。这不是很方便,因为这些钩子每次调用运行一次,而不是每个包运行一次,并且它们没有提供一种方法来告诉进程将做什么或已经做了什么。查找所发生情况的间接方法是在操作之前和之后记录您感兴趣的包的状态,并在状态发生更改时调用您的自定义操作。您还可以通过解析日志()来获取此信息。--pre-invoke=COMMAND--post-invoke=COMMANDDPKG_HOOK_ACTIONdpkgdpkg/var/log/dpkg.log


更具体的解决方案是使用 Debian 为您的问题提供的标准机制。包nginx(或者更确切地说nginx-lightnginx-fullinvoke-rc.d nginx start作为其安装后 ( postinst) 脚本的一部分以及invoke-rc.d nginx stop作为其预删除 ( prerm) 脚本的一部分进行调用。将命令替换invoke-rc.d为专为 runit 和调用定制的命令sv;你可能想使用dpkg-divert为了那个原因:

dpkg-divert --add --rename --divert /usr/sbin/invoke-rc.d.sysvinit /usr/sbin/invoke-rc.d
ln -s invoke-rc.d.runit /usr/sbin/invoke-rc.d

invoke-rc.d或者,将您自己的适应副本放在sv路径/usr/sbin上,例如在/usr/local/sbin.

该脚本/usr/sbin/invoke-rc.d.runit/usr/sbin/invoke-rc.d应该负责实现invoke-rc.d界面:

  • 支持ACTION 为, , , ,之一的语法。invoke-rc.d SERVICE ACTIONstartstoprestartforce-reloadreload
  • 支持该选项--quiet(我看到的唯一一个被我的系统上的软件包维护脚本使用的选项,我还没有对所有 Debian 软件包进行详尽的搜索)。
  • /usr/sbin/policy-rc.d如果需要,请按照手册页中的描述进行调用(例如,避免在 chroot 或容器中运行服务)。

如果您只想使用 runit 管理 Nginx,那么invoke-rc.d如果服务名称不是 ,请使用标准运行nginx


考虑到所有因素,如果您只想使用 Runit 管理 Nginx,那么转移(甚至编辑 - 它是一个conffile)/etc/init.d/nginx似乎是最简单的方法。使用现有脚本作为起点,并将调用替换为start-stop-daemon适当的nv调用。

相关内容