如何知道上次执行“apt-get update”的时间?

如何知道上次执行“apt-get update”的时间?

我知道更新存储库列表的命令是:

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-stamphistory.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

您可以在终端中检查命令历史记录:

history | grep 'apt update'

按时间检查:

HISTTIMEFORMAT="%d/%m/%y %T " history | grep '[a]pt update'

[a]正则表达式的一部分只匹配字母a,但是在历史记录中进行 grep 时会产生不匹配自身的效果。)

带时间戳的终端历史记录

答案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

相关内容