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

我需要find最后一次

apt-get update 

命令在我的服务器上运行。 我如何确定这些信息?

至less在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”调用的时间。

如果你的系统没有这个aptconfiguration文件,你可以随时添加它。

您可以检查/ var / lib / apt / lists中的文件上的访问时间,当您运行apt-get更新时更新。 如果使用sudo运行apt-get更新,那么在完成后应该有一行logging在/var/log/auth.log中。

apt-get update可能不会创build或更新文件,它会更新caching目录,以便在最新的apt-get update运行时使用它来获取时间戳:

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

不要从locking文件中删除。 locking文件不可靠,随着时间的推移,它们会随着新的Linux发行版本而移动,许多程序在完成locking文件时会清除(移除)locking文件。

以下命令将会帮助你find你想要的东西。

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

这是一个两个命令。 第一个命令的结果通过pipe道(|)符号过滤到第二个。

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

在命令的“grep”部分,“-o”开关告诉grep只显示每行与正则expression式完全匹配的部分。 我在这里使用的正则expression式检测date时间,在“ls”命令中指定的格式。 你还会注意到在“grep”命令的最后一个真正的小魔术,那里有一个“-m”开关,数字“1”紧随其后。 这告诉“grep”在find第一个之后停止查找匹配。

因此,总而言之,我们列出了apt日志文件的详细信息,以便我们可以看到最后的修改date,然后按date进行sorting,并告诉grep将第一个date从顶端退出,然后返回。 这是apt-get运行的最后一个date。

然而,为了扮演魔鬼的拥护者,像Ubuntu这样的Debian平台常常把apt-get作为一个定期运行的工作。 如果您正在寻找apt-get执行的另一端的人,您实际上可能会find一台机器。 你总是可以用apt日志来匹配访问日志,看看是否有时间戳。 也可以在一定程度上查看用户的命令历史logging。

希望这可以帮助!

我怀疑你可以检查文件/ var / cache / apt的最后修改时间,以确定何时上次更新应用于软件包列表。

我刚刚testing过这个,连续两次运行“sudo apt-get update”,date并没有改变,但是我怀疑这是因为没有新的更新来应用,至今。

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

突触logging历史文件(>文件>历史logging),aptitude在/ var / log / aptitude中logging两个历史logging,并在/ var / lib / aptitude / pkgstates中logging自动安装的软件包,以便您可以检查这些文件是否为最新活动。

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

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

我使用/var/cache/apt来确定是否需要运行apt-get update 。 默认情况下,如果当前时间和/var/cache/aptcaching时间之差小于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提取这些function: https : //github.com/gdbtek/ubuntu-cookbooks/blob/master/libraries/util.bash

如果在最后一天还没有运行,那么这里有一个简单的单行程序来运行更新。

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

它会查找更新成功标记文件,该文件在一天前已被修改。 如果find适合年龄的文件,则运行更新。 注意:更新成功标记文件必须存在才能正常工作。