最近我遇到了一个不错的checkrestart
工具,用于检查正在运行的进程是否使用最近更新的库的过时版本,并且需要重新启动才能使用更新的库加载它们。目前,checkrestart
每次使用apt-get upgrade
或 时,我都必须手动调用aptitude upgrade
。
有没有办法在升级某些软件包apt-get
后自动调用此类命令?aptitude
如果解决方案也适用于 则加分unattended-upgrades
。
答案1
经过更多搜索后,发现了我已经怀疑的内容:apt
它本身提供了一组钩子来在某些事件中调用命令,许多工具都使用它,但似乎几乎没有记录。
checkrestart
在软件包升级后调用工具相当简单。只需将以下代码行放入/etc/apt/apt.conf
现有文件之一或新文件中/etc/apt/apt.conf.d/
:
DPkg::Post-Invoke-Success { '/usr/sbin/checkrestart';};
checkrestart
每次dpkg
被调用apt
(当然还有依赖于 的任何其他工具apt
,例如aptitude
)并成功完成时,都会调用该函数。
答案2
有几种方法可以做到这一点。
使用脚本
一个快速而肮脏的解决方案是编写一个名为apt-get
or的脚本aptitude
,并使其调用实际程序,如下所示:
#!/bin/bash
# filename: apt-get
# '$@' is all of the arguments passed to the script
/usr/bin/apt-get-bin "$@"
# or /usr/bin/aptitude-bin "$@"
if [[ $1 == *upgrade* ]] ; then
checkrestart
fi
使脚本可执行:chmod +x apt-get
.您可能还想让该脚本归 root: 所有chown root apt-get; chgrp root apt-get
。请小心不要在脚本上设置 setuid 位,因为如果攻击者获得了对该脚本的写入权限,他们可以快速轻松地修改它以获取 root shell。
当然,此方法需要您将实际的二进制文件移动到另一个位置,并将 shell 脚本移动到路径中的某个位置。放置用户脚本的正确位置是/usr/local/bin
.但在这种情况下,您应该将脚本放在移动二进制文件之前实际所在的位置,以便保持组织有序。
以这种方式用脚本替换二进制文件是相当具有侵入性的,并且会影响计算机上的所有用户。作为替代方案,您可以将脚本命名为类似的名称apt-get-cr
,只需记住调用该脚本而不是apt-get
.您还可以编写一个 shell 函数。
使用外壳函数
使用 shell 函数可以保留命令名称,apt-get
而无需移动二进制文件。
apt-get() {
# 'command' makes sure this function doesn't call itself.
# You could also use a direct path the binary as shown above.
command apt-get "$@"
if [[ $1 == *upgrade* ]] ; then
checkrestart
fi
}
将此函数放在 shell 配置中的某个位置(~/.bashrc
、~/.zshrc
等)
这种方法通常比脚本方法的侵入性要小很多。此外,它不需要移动二进制文件,这通常只有 root 用户才能做到。
不利的一面是,shell 函数方法在 shell 之间并不总是非常可移植,并且本质上不能像脚本方法那样与图形界面(例如启动器栏)很好地配合(您几乎总是可以将脚本视为可执行二进制文件。 )