我在 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
当然,正如其他人指出的那样,请确保此代码只有一个实例正在运行。