Answers:
至少在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配置文件,则可以随时添加它。
您可以检查/ var / lib / apt / lists中文件的访问时间,该文件在运行apt-get update时会更新。如果apt-get update是使用sudo运行的,则完成后应该在/var/log/auth.log中记录一行。
不要走锁文件。锁定文件并不可靠,随着新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日志进行匹配,以查看是否有任何时间戳记重合。也可以在一定程度上查看用户的命令历史记录。
希望这可以帮助!
/var/log/apt
它的时候我例如做一个也记录apt-get install some-package
。其实在Ubuntu上它并没有记录的东西时,我做的apt-get update
Synaptic会记录一个历史记录文件(>“文件”>“历史记录”),aptitude会将历史记录记录在/ var / log / aptitude中,并将自动安装的软件包记录在/ var / lib / aptitude / pkgstates中,因此您可以检查它们的最新活动。
我/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
info
和isEmptyString
?另外,info
函数名的选择不当,因为这也是命令。除此之外,不错的解决方案!
将apt-get包装在脚本中,该脚本首先将时间戳记写入文件,然后执行通常的工作。这样,您可以定义时间戳的格式和位置;)
如果没有在最后一天运行更新,这是运行更新的简单方法。
(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文件,此文件才能起作用。
/var/lib/apt/periodic/update-stamp