如何知道上一次执行“ apt-get update”?


24

我知道更新存储库列表的命令是apt-get update

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

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

在手册页上找不到有用的内容。

Answers:


15

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

history | grep 'apt update'

要按时间检查:

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

[a]正则表达式的部分仅与字母匹配,a但是在历史记录中grepping时会导致其自身不匹配。)

在此处输入图片说明

希望能帮助到你 !


2
这是history | grep 'apt-get update':)
Lucio 2014年

7
@souravc是正确的。这将无法单独工作。如果HISTTIMEFORMAT未设置,.bashrc则此命令将仅具有从当前Shell会话实际执行的命令的正确时间戳。对于并非来自当前会话的所有其他命令,时间戳将仅显示~/.bash_history文件的修改时间戳。它无法显示来自其他会话的命令的时间戳,因为这些时间戳未保存在~/.bash_history文件中。它可以显示当前会话的时间戳,因为这些标记仍在内存中。
falconer 2014年

7
这并不总是有效。例如,当其他用户运行apt.bash_history修剪时。
OrangeTux 2014年

4
这是一个非常错误的答案。它不考虑无人值守的升级,另外,如果您像我这样总是打开4-5个终端的人,历史记录仅在它们退出时被保存(默认情况下),因此您必须检查所有记录。
hackel

3
与每个人都说的相呼应,如果通过脚本更新了apt,如果您没有查看正确的历史记录,修剪过的历史记录或其他用户已完成更新,则将无法使用。这确实不足以解决一般情况。
zneak

54

检查的时间戳/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:41apt-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在某些系统中仍然不可用。有一个新的建议,derobert 寻找到该文件/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

我的/var/lib/apt/periodic/目录为空
virtualxtc 2014年

我的目录也为空。Debian 7.3喘不过气来。
cavila 2014年

6
更好的备份位置将是/var/cache/apt/pkgcache.bin。另外,请不要解析ls; 的输出。使用stat代替。请记住,ls输出取决于语言环境,文件年龄等。(另外,我认为如果安装了update-notifier-common,您只会得到建议的第一个文件)
derobert 2014年

2
/var/cache/apt/pkgcache.bin软件包安装似乎也涉及到这一点,因此这不是检查上次apt-get update运行的可靠方法。
GnP '16

3
...我刚刚发现apt-get clean最近运行的Debian 8系统将没有/var/cache/apt/pkgcache.bin。我将尝试使用from中的mtime /var/lib/apt/lists,因为这似乎是apt-get update实际操作的原始非缓存数据。
ssokolow

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
}

样本输出:

<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



1

我用这个命令

stat /var/cache/apt/ | grep -i -e access -e modify

显示上次访问的时间,即。也在上次实际更新时运行“ apt-get更新”。

请注意,如果时间不同,则可能没有可用的更新。由于我有在特定时间由crontab运行的更新和升级,因此可以确定更新是否已运行。


1

将@ssokolow的最新评论与的答案相结合 此处,则该命令将apt-get update在最近7天未运行时运行:

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

说明:

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

0

我刚刚针对以下主题发布了该问题的答案

在哪里可以查看我的更新历史记录?

答案可能不太适合该主题,因为它专门查找“ apt-get升级”。这是示例输出。

xenial% 9: ./linuxpatchdate 
2016-07-19 54
2017-02-24 363
2017-03-08 7
2017-03-09 2

请参阅另一个主题以获取源代码和更多说明。


在我看来,您的代码在寻找升级而不是更新。例如,我只是在Ubuntu 16.04上运行了“ apt-get update”(此问题的主题),而在/ var / log / apt中没有一个更改出现,这意味着扫描该目录中的任何内容都没有用回答这个特定问题。
罗恩·伯克

1
你完全正确。感谢您指出了这一点。我更改了答案以反映这一点。我们正在寻找将更新应用到计算机的最新日期,而不是仅下载更新。
JsinJ

0
LAST_UPDATED=$( stat --format="%X" /var/cache/apt/pkgcache.bin )
UNIX_TIME=$( date +%s )
TIME_DIFF=$(( UNIX_TIME - LAST_UPDATED ))

if [[ "${TIME_DIFF}" -gt 43200 ]]
then
  # It's been 12 hours since apt-get update was ran.
fi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.