Я знаю, что команда для обновления списков репозитория - apt-get update
.
Как проверить, было ли оно выполнено сегодня или за последние 24 часа?
Я не знаю, стоит ли проверять временную метку файла. Или введите другую команду apt. Или используйте утилиту dpkg.
Не удалось найти что-то полезное на страницах руководства.
Вы можете проверить историю команд в терминале:
history | grep 'apt update'
Чтобы проверить это по времени:
HISTTIMEFORMAT="%d/%m/%y %T " history | grep '[a]pt update'
(Часть регулярного выражения [a]
соответствует только букве a
, но имеет эффект, чтобы не совпадать при поиске в истории.)
Надеюсь, это помогает!
Проверьте отметку времени /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:41
, когда apt-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-stamp
или history.log
остаются недоступными в некоторых системах. Существует новое предложение от Дероберта для просмотра в файле /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/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
Вам также может быть интересен файл:
/var/log/apt/term.log
Откройте его с меньше или cat как корень .
Я использую эту команду
stat /var/cache/apt/ | grep -i -e access -e modify
, чтобы показать, когда в последний раз к ней обращались, т.е. запуск 'apt-get update' также в прошлый раз, когда он был фактически обновлен.
обратите внимание, что если времена отличаются, возможно, обновление недоступно. Поскольку мои обновления и обновления выполняются crontab в определенное время, я могу сказать, запускались ли мои обновления или нет.
Комбинируя последний комментарий @ 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
гарантирует, что find не попадет в содержимое каталога. -H
разыменовывает /var/lib/apt/lists
, если это мягкая ссылка find
не удается, то команда будет выполнена. Это кажется мне безопасным по умолчанию. Если вы хотите перевернуть значение по умолчанию, используйте -n
в тесте и -mtime +7
в команде поиска. Я только что опубликовал ответ на этот вопрос по следующей теме
Где я могу посмотреть историю обновлений?
Ответ может быть менее подходящим для этой темы , так как он специально ищет «apt-get upgrade». Вот пример вывода.
xenial% 9: ./linuxpatchdate
2016-07-19 54
2017-02-24 363
2017-03-08 7
2017-03-09 2
См. В другой теме исходный код и дополнительные пояснения.
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
В частности, для apt
я рекомендую этот однострочный от @itsadok:
[ -z "$(find -H /var/lib/apt/lists -maxdepth 0 -mtime -7)" ] && sudo apt-get update
Однако, если вам нужен более портативный " менеджер пакетов обновлений на минимум каждые x дней "семантика, вы можете просто коснуться временного файла при обновлении.
Например:
APT_UPDATED="/tmp/apt-update-tstamp"
# Delete temp file created >1 day ago
find "$APT_UPDATED" -mtime +1 -exec rm {} \; 2>/dev/null
# Update apt if needed
if [ ! -f "$APT_UPDATED" ]; then
if apt-get update; then
touch "$APT_UPDATED"
fi
fi
Это должно работать в большинстве сценариев, так как: