我知道更新存储库列表的命令是:
apt-get update
如何检查它是否在今天或者过去24小时内执行过?
我不知道是否应该检查某个文件时间戳。或者发出另一个apt
命令。或者使用dpkg
实用程序。
在手册页中找不到有用的内容。
答案1
检查的时间戳/var/lib/apt/periodic/update-success-stamp
。
$ ls -l /var/lib/apt/periodic/update-success-stamp
-rw-r--r-- 1 root root 0 Jan 25 01:41 /var/lib/apt/periodic/update-success-stamp
这里的时间是上次执行的Jan 25 01:41
时间apt-get
。若要仅获取时间,请在终端中使用以下命令:
$ ls -l /var/lib/apt/periodic/update-success-stamp | awk '{print $6" "$7" "$8}'
Jan 25 01:41
这是检查上次更新时间的最佳位置。如果你发现/var/lib/apt/periodic/
是空的,你可以尝试,
ls -l /var/log/apt/history.log
更新
发现由于某些原因,上述文件update-success-stamp
或history.log
在某些系统中仍然不可用。有一个新的提议从德罗伯特 查看该文件/var/cache/apt/pkgcache.bin
。
pkgcache.bin
是 Apt 的内存映射包缓存位置。每次更新后都会更新。因此它是了解上次apt
更新时间的最佳选择。
可以使用以下命令来了解确切时间,
ls -l /var/cache/apt/pkgcache.bin | cut -d' ' -f6,7,8
或者
stat /var/cache/apt/pkgcache.bin
答案2
答案3
我用它/var/cache/apt
来判断是否需要运行apt-get update
。默认情况下,如果当前时间和缓存时间的差值/var/cache/apt
小于 24 小时,则不需要运行apt-get update
。可以通过将数字传递给函数来覆盖默认更新间隔runAptGetUpdate()
function trimString()
{
local -r string="${1}"
sed -e 's/^ *//g' -e 's/ *$//g' <<< "${string}"
}
function isEmptyString()
{
local -r string="${1}"
if [[ "$(trimString "${string}")" = '' ]]
then
echo 'true'
else
echo 'false'
fi
}
function info()
{
local -r message="${1}"
echo -e "\033[1;36m${message}\033[0m" 2>&1
}
function getLastAptGetUpdate()
{
local aptDate="$(stat -c %Y '/var/cache/apt')"
local nowDate="$(date +'%s')"
echo $((nowDate - aptDate))
}
function runAptGetUpdate()
{
local updateInterval="${1}"
local lastAptGetUpdate="$(getLastAptGetUpdate)"
if [[ "$(isEmptyString "${updateInterval}")" = 'true' ]]
then
# Default To 24 hours
updateInterval="$((24 * 60 * 60))"
fi
if [[ "${lastAptGetUpdate}" -gt "${updateInterval}" ]]
then
info "apt-get update"
apt-get update -m
else
local lastUpdate="$(date -u -d @"${lastAptGetUpdate}" +'%-Hh %-Mm %-Ss')"
info "\nSkip apt-get update because its last run was '${lastUpdate}' ago"
fi
}
示例输出:
<root@ubuntu><~/ubuntu-cookbooks/libraries>
# runAptGetUpdate
Skip apt-get update because its last run was '0h 37m 43s' ago
我从我的个人github中提取了这些函数:https://github.com/gdbtek/ubuntu-cookbooks/blob/master/libraries/util.bash
答案4
如果有人感兴趣,这就是方法Ansible 可以做到:
APT_UPDATE_SUCCESS_STAMP_PATH = "/var/lib/apt/periodic/update-success-stamp"
APT_LISTS_PATH = "/var/lib/apt/lists"
#
# [...]
#
def get_cache_mtime():
"""Return mtime of a valid apt cache file.
Stat the apt cache file and if no cache file is found return 0
:returns: ``int``
"""
cache_time = 0
if os.path.exists(APT_UPDATE_SUCCESS_STAMP_PATH):
cache_time = os.stat(APT_UPDATE_SUCCESS_STAMP_PATH).st_mtime
elif os.path.exists(APT_LISTS_PATH):
cache_time = os.stat(APT_LISTS_PATH).st_mtime
return cache_time