我知道更新存储库列表的命令是:
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:41在apt-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-stamp或history.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)
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时具有不匹配自身的效果。)
我/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
结合 @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查找命令中使用。| 归档时间: |
|
| 查看次数: |
34239 次 |
| 最近记录: |