仅当 apt-get 缓存早于特定时间时才更新它

仅当 apt-get 缓存早于特定时间时才更新它

我在 debian 上。仅当自上次更新以来的时间大于或小于一定量时,我才想执行 apt-get 更新(也许还有其他内容)使用直接命令,没有 cron 技巧或类似的

假设我对 apt-get 之前的状态一无所知,自操作系统安装以来,可能从未发布过更新,或者在 2 分钟前手动触发,或者由无人值守升级服务自动发布。

例如。

if(time > 30 min) apt-get update
if(time > 2 days) something else

这个问题与我在askubuntu 中发现的另一个问题类似,但由于debian 配置中的设置不同,我找不到一个时间戳文件来通知我上次更新命令发生的时间。

答案1

/var/cache/apt/pkgcache.bin每次运行时都会重新生成该文件apt-get update(否则不会重新生成)。

例如,如果您只想apt-get update在过去一小时内未运行过的情况下运行,则可以使用

#!/bin/sh
last_update=$(stat -c %Y /var/cache/apt/pkgcache.bin)
now=$(date +%s)
if [ $((now - last_update)) -gt 3600 ]; then
  apt-get update
fi

或者

#!/bin/sh
if [ -z "$(find /var/cache/apt/pkgcache.bin -mmin -60)" ]; then
  apt-get update
fi

请注意,如果您几乎同时运行此脚本的多个副本,它们可能都会决定运行apt-get update.如果这是一个问题,请使用锁(这是一个完全独立的问题)。

答案2

建立在现有答案回到 2016 年(5 年+),在 debian stable(版本 11)和 oldstable(v.10)上该文件/var/cache/apt/pkgcache.bin不能存在:

+ cat /etc/debian_version
10.11

一个工作替代品(如查找)适合我:

if [ -z "$(find /var/cache/apt -maxdepth 0 -mmin -60)" ]; then
  apt-get update              
fi

记下find(1)s 的-maxdepth 0参数和值。


考虑到我对标志文件(或目录)时间信息可用于有条件地调用命令的原始含义的理解,原始答案仍然回答了这个问题apt-get update

这可能是由于 的更改所致apt-get(8),但我无法完全查看此答案的更改(例如,自哪个版本更改以来),它仅反映了我个人的实际经验。 YMMV。


这个答案需要注意的是依赖目录节点的时间信息。与文件节点(之前的文件节点)相比,我认为这是有辱人格的。应用此类更改时,请检查文件系统的详细信息。 YMMV。


参考:

答案3

就像其他答案所说,修改时间/var/cache/apt/pkgcache.bin是指标,但该文件最初在最新版本的 Ubuntu 上不会存在。

这是is_modified_within_minutes我想出的一个简短的函数,以及如何使用它:

is_modified_within_minutes() { test -f "$1" && test -z "$(find "$1" -mmin +$2)"; }

is_modified_within_minutes /var/cache/apt/pkgcache.bin 1440 || sudo apt-get update

当然,正如其他人指出的那样,请确保此代码只有一个实例正在运行。

相关内容