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

cav*_*ila 32 updates apt logs

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

apt-get update
Run Code Online (Sandbox Code Playgroud)

如何检查它是否在今天或过去 24 小时内执行过?

我不知道我是否应该检查一些文件时间戳。或者发出另一个apt命令。或使用dpkg实用程序。

在手册页中找不到有用的东西。

sou*_* c. 68

检查 的时间戳/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
Run Code Online (Sandbox Code Playgroud)

在这里,时间是Jan 25 01:41apt-get最后执行。要仅获取时间,请在终端中使用以下命令,

$ ls -l /var/lib/apt/periodic/update-success-stamp | awk '{print $6" "$7" "$8}'
Jan 25 01:41
Run Code Online (Sandbox Code Playgroud)

这是检查上次更新时间的最佳位置。如果你发现/var/lib/apt/periodic/空了你可以试试,

ls -l /var/log/apt/history.log
Run Code Online (Sandbox Code Playgroud)

更新

发现由于某些原因上述文件update-success-stamphistory.log在某些系统中仍然不可用。有一个新的建议,derobert 寻找到该文件/var/cache/apt/pkgcache.bin

pkgcache.bin是 Apt 的内存映射包缓存位置。每次更新后都会更新。所以它是知道上次apt更新时间的完美候选者。

可以使用以下命令来知道确切的时间,

ls -l /var/cache/apt/pkgcache.bin | cut -d' ' -f6,7,8
Run Code Online (Sandbox Code Playgroud)

或者

stat /var/cache/apt/pkgcache.bin
Run Code Online (Sandbox Code Playgroud)

  • 更好的备份位置是`/var/cache/apt/pkgcache.bin`。另外,请不要解析`ls`的输出;改用`stat`。请记住,`ls` 输出取决于语言环境,取决于文件的年龄等。(另外,我认为如果您安装了 update-notifier-common,您只会得到您建议的第一个文件) (7认同)
  • ...我刚刚发现最近运行了 `apt-get clean` 的 Debian 8 系统将没有 `/var/cache/apt/pkgcache.bin`。我将尝试使用 `/var/lib/apt/lists` 中的 mtime,因为这似乎是 `apt-get update` 实际操作的原始、非缓存数据。 (4认同)
  • 似乎`/var/cache/apt/pkgcache.bin` 也涉及包安装,所以它不是检查最后一次 `apt-get update` 运行的可靠方法。 (2认同)

nux*_*nux 21

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

history | grep 'apt update'
Run Code Online (Sandbox Code Playgroud)

按时间检查:

HISTTIMEFORMAT="%d/%m/%y %T " history | grep '[a]pt update'
Run Code Online (Sandbox Code Playgroud)

[a]正则表达式的部分只匹配字母,a但在历史中grepping时具有不匹配自身的效果。)

带时间戳的终端历史记录

  • 这并不总是有效。例如,当其他用户运行 `apt` 或当你的 `.bash_history` 被修剪时。 (10认同)
  • 这是一个非常错误的答案。它不考虑无人值守升级,另外,如果你像我一样总是打开 4-5 个终端,历史只会在他们退出时保存(默认情况下),所以你必须检查所有这些。 (9认同)
  • @souravc 是对的。这不会单独工作。如果`.bashrc` 中没有设置`HISTTIMEFORMAT`,那么这个命令将只有从**当前shell 会话** 实际执行的命令的正确时间戳。对于不是来自当前会话的所有其他命令,时间戳将仅显示 `~/.bash_history` 文件的修改时间戳。它无法显示来自其他会话的命令的时间戳,因为这些时间戳未保存在 `~/.bash_history` 文件中。它可以显示当前会话的时间戳,因为这些时间戳仍在内存中。 (7认同)
  • 回应每个人已经说过的内容,如果 apt 已被脚本更新,如果您没有查看正确的历史记录,如果历史记录已被修剪,或者如果另一个用户已完成更新,那么这将不起作用。这确实不够可靠,无法解决一般情况。 (3认同)
  • 它是`历史| grep 'apt-get 更新'` :) (2认同)

Nam*_*yen 6

/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
}
Run Code Online (Sandbox Code Playgroud)

示例输出:

<root@ubuntu><~/ubuntu-cookbooks/libraries>
# runAptGetUpdate 

Skip apt-get update because its last run was '0h 37m 43s' ago
Run Code Online (Sandbox Code Playgroud)

我从我的个人 github 中提取了这些函数:https : //github.com/gdbtek/ubuntu-cookbooks/blob/master/libraries/util.bash


its*_*dok 5

结合 @ssokolow 的最后评论和此处的答案apt-get update如果该命令在过去 7 天内未运行,则该命令将运行:

[ -z "$(find -H /var/lib/apt/lists -maxdepth 0 -mtime -7)" ] && sudo apt-get update
Run Code Online (Sandbox Code Playgroud)

解释:

  • -mtime -7查找最近 7 天内更改时间的文件。-mmin如果您关心较短的时间,则可以使用。
  • -maxdepth 0确保 find 不会进入目录的内容。
  • -H/var/lib/apt/lists如果是软链接则取消引用
  • 如果由于某种原因find失败,则该命令将运行。在我看来,这似乎是安全的默认设置。如果您想翻转默认值,请-n在测试和-mtime +7查找命令中使用。