查找上一次使用apt-get执行的更新


Answers:


23

至少在Ubuntu系统中,文件/etc/apt/apt.conf.d/15update-stamp包含:

APT::Update::Post-Invoke-Success {"touch /var/lib/apt/periodic/update-success-stamp 2>/dev/null || true";};

因此,请查看是否具有/ var / lib / apt / periodic / update-success-stamp,如果有,则可以使用

stat -c %y /var/lib/apt/periodic/update-success-stamp

命令以获取上一次“ apt-get update”调用的时间。

而且,如果您的系统没有该apt配置文件,则可以随时添加它。


+1(包括apt.conf行)。在ubuntu 14.04上,文件似乎位于/var/lib/apt/periodic/update-stamp
GnP

11

您可以检查/ var / lib / apt / lists中文件的访问时间,该文件在运行apt-get update时会更新。如果apt-get update是使用sudo运行的,则完成后应该在/var/log/auth.log中记录一行。


2
正如在其他地方指出的那样,您可能会发现某些文件未更新,因此没有再次下载。如果您想知道软件包列表是最新的,那么很好,但是如果您不想知道上次运行apt-get update的时间,则可以。前者更有可能。
David Pashley 2009年

10

一个apt-get update可能无法创建或更新文件,它更新缓存目录,所以我们可以用它来获取时间戳的最后时apt-get update被运行:

stat -c %Y /var/cache/apt/

请注意,软件包安装也可能会更新缓存目录。这不是对apt-get update
GnP

3

不要走锁文件。锁定文件并不可靠,随着新Linux版本的发布,锁定文件会随着时间的流逝而移动,许多程序在完成锁定后都会清理(删除)锁定文件。

以下命令将为您提供所需的信息。

ls -lt --time-style="long-iso" /var/log/apt | grep -o '\([0-9]\{2,4\}[- ]\)\{3\}[0-9]\{2\}:[0-9]\{2\}' -m 1

这是两个命令合二为一。第一个命令的结果通过竖线(|)过滤到第二个命令中。

在第一个命令中,我使用“ ls”列出/ var / log / apt目录的文件内容,该目录存储apt-get的访问历史日志。“ -lt”部分实际上是两个开关。第一个“ l”开关告诉“ ls”每行列出一个文件并详细说明。第二个“ t”开关告诉“ ls”按日期和时间排序。“ --time-style”强制日期时间以“ YYYY-MM-DD HH:MM”格式显示。

在命令的“ grep”部分中,“-o”开关告诉grep仅显示每行与正则表达式完全匹配的部分。我在这里使用的正则表达式检测日期时间,格式为“ ls”命令中指定的格式。您还会在“ grep”命令的最后看到真正的魔力,即紧随其后的是带有数字“ 1”的“ -m”开关。这告诉“ grep”在找到第一个匹配项后停止寻找匹配项。

因此,总而言之,我们将列出apt日志文件的详细信息,以便我们可以看到上次修改的日期,然后按日期排序,并告诉grep将第一个日期从顶部拉出,然后将其返回。那是apt-get运行的最后日期。

但是,要暂时扮演恶魔的拥护者,像Ubuntu这样的Debian平台通常会将apt-get安排为定期运行的工作,这很常见。如果您正在apt-get执行的另一端寻找人员,则实际上可能会找到一台机器。您始终可以将访问日志与apt日志进行匹配,以查看是否有任何时间戳记重合。也可以在一定程度上查看用户的命令历史记录。

希望这可以帮助!


1
不幸的是不起作用。在/var/log/apt它的时候我例如做一个也记录apt-get install some-package。其实在Ubuntu上它并没有记录的东西时,我做的apt-get update
亚历克斯

2

我怀疑您可以在文件/ var / cache / apt上检查上次修改时间,以了解上次更新何时应用于软件包列表。

我刚刚对此进行了测试,并连续运行了两次“ sudo apt-get update”,并且日期没有从其当前值更改,但是我怀疑这是因为没有新的更新要应用,并且缓存已满至今。


1
$ ls -l /var/lib/dpkg/lock 
-rw-r----- 1 root root 0 2011-11-16 09:40 /var/lib/dpkg/lock

1

Synaptic会记录一个历史记录文件(>“文件”>“历史记录”),aptitude会将历史记录记录在/ var / log / aptitude中,并将自动安装的软件包记录在/ var / lib / aptitude / pkgstates中,因此您可以检查它们的最新活动。


1

/var/cache/apt经常确定是否需要跑步apt-get update。默认情况下,如果当前时间与的缓存时间之间的/var/cache/apt差小于24小时,则无需运行apt-get update。可以通过向函数传递数字来覆盖默认更新间隔runAptGetUpdate()

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


答案不完整。什么是infoisEmptyString?另外,info函数名的选择不当,因为这也是命令。除此之外,不错的解决方案!
罗尼·安德森


0

/var/log/dpkg.log会保留已完成操作的历史记录,但不一定会记录哪个应用程序称为dpkg(突触,apt-get等)。


0

将apt-get包装在脚本中,该脚本首先将时间戳记写入文件,然后执行通常的工作。这样,您可以定义时间戳的格式和位置;)


Sujoy,如果您有数百台服务器,将其包装在脚本中是不切实际的,并且您不希望维护另一个脚本,这可能在下次更新apt-get软件包时引起问题。我认为请求者正在寻找一个利用他计算机中已经存在的信息的答案。
pdwalker 2011年

0

如果没有在最后一天运行更新,这是运行更新的简单方法。

(find /var/lib/apt/periodic/update-success-stamp -mtime +1 | grep update-success-stamp) && (/usr/bin/apt-get update)

它会寻找一天以上修改过的update-success-stamp文件。如果找到正确使用期限的文件,则它将运行更新。注意:必须存在update-success-stamp文件,此文件才能起作用。

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.