Как узнать, когда в последний раз выполнялось `apt-get update`?


24

Я знаю, что команда для обновления списков репозитория есть apt-get update.

Как проверить, было ли оно выполнено сегодня или за последние 24 часа?

Я не знаю, следует ли проверять временную метку файла. Или введите другую команду apt. Или используйте утилиту dpkg.

Не удалось найти что-то полезное на страницах руководства.

Ответы:


15

Вы можете проверить историю команд в терминале:

history | grep 'apt update'

Чтобы проверить это по времени:

HISTTIMEFORMAT="%d/%m/%y %T " history | grep '[a]pt update'

( [a]Часть регулярного выражения совпадает только с буквой, aно имеет эффект не совпадать с самим собой при поиске в истории.)

введите описание изображения здесь

Надеюсь, это поможет !


2
Это history | grep 'apt-get update':)
Lucio

7
@souravc прав. Это не будет работать само по себе. Если значение HISTTIMEFORMATне задано, .bashrcтогда эта команда будет иметь только правильные временные метки для команд, которые фактически были выполнены из текущего сеанса оболочки . Для всех других команд, которые не относятся к текущему сеансу, временная метка будет показывать только временную метку изменения ~/.bash_historyфайла. Он не может отображать временные метки для команд из других сеансов, поскольку эти временные метки не сохраняются в ~/.bash_historyфайле. Он может показывать метки времени для текущего сеанса, потому что эти метки все еще находятся в памяти.
сокольничий

7
Это не всегда работает. Например, когда побежал какой-то другой пользователь aptили когда ваш .bash_historyбыл урезан.
OrangeTux

4
Это ужасно неправильный ответ. Он не учитывает автоматические обновления, к тому же, если вы такой же, как я, у которого всегда открыто 4-5 терминалов, история сохраняется только при выходе (по умолчанию), поэтому вам придется проверить все из них.
хакель

3
Повторяя то, что все уже сказали, это не сработает, если apt был обновлен скриптом, если вы не просматриваете правильную историю, если история была урезана, или если другой пользователь сделал обновление. Это на самом деле не достаточно надежно, чтобы решить общее дело.
zneak

54

Проверьте отметку времени /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/lib/apt/periodic/каталог пуст
virtualxtc

Мой каталог также пуст. Debian 7.3.
кавила

6
Лучшее место для резервного копирования будет /var/cache/apt/pkgcache.bin. Также, пожалуйста, не анализируйте вывод ls; используйте statвместо Имейте в виду, что lsвывод зависит от локали, от возраста файла и т. Д. (Кроме того, я думаю, что вы получите первый предложенный файл, только если у вас установлен update-notifier-common)
derobert

2
Кажется /var/cache/apt/pkgcache.bin, также затронут вопрос установки пакета, поэтому это не надежный способ проверки последнего apt-get updateзапуска.
GnP

3
... и я только что обнаружил, что система Debian 8, где apt-get cleanнедавно запускались, не будет иметь /var/cache/apt/pkgcache.bin. Вместо /var/lib/apt/listsэтого я попытаюсь использовать mtime from , поскольку, похоже, это необработанные, не кэшированные данные, которые apt-get updateфактически манипулируют.
Ssokolow

6

Я использую, /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


2

Вас также может заинтересовать файл:

/var/log/apt/term.log

Откройте это с меньшим количеством или кошкой как корень .


Это разумное место для проверки журналов действий, выполненных apt над базой данных пакетов, но на самом деле постер хочет знать об этом apt-get update, и это явно не записано.
Фахим Митха

1

Я использую эту команду

stat /var/cache/apt/ | grep -i -e access -e modify

чтобы показать, когда в последний раз к нему обращались, т.е. запуск 'apt-get update' также в прошлый раз, когда он был фактически обновлен.

обратите внимание, что если времена разные, возможно, обновление недоступно. Так как мои обновления и обновления выполняются crontab в определенное время, я могу сказать, запускались ли мои обновления или нет.


1

Комбинируя последний комментарий @ 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в команде find.

0

Я только что опубликовал ответ на этот вопрос в следующей теме

Где я могу посмотреть историю обновлений?

Ответ может быть менее подходящим для этой темы, так как он специально ищет «apt-get upgrade». Вот пример вывода.

xenial% 9: ./linuxpatchdate 
2016-07-19 54
2017-02-24 363
2017-03-08 7
2017-03-09 2

В другой теме приведен исходный код и дополнительные пояснения.


Мне показалось, что ваш код выглядел как обновление, а не обновление. Например, я только что запустил «apt-get update» (предмет этого вопроса) на моей Ubuntu 16.04, и в / var / log / apt не появляется ни капли изменений, подразумевая, что сканирование чего-либо в этом каталоге будет бесполезным в ответ на этот конкретный вопрос.
Рон Берк

1
Ты совершенно прав. Спасибо что подметил это. Я изменил свой ответ, чтобы отразить это. Мы искали дату, когда обновления были применены к машине, а не только что загруженные обновления.
JsinJ

0
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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.