Як дізнатися, коли востаннє виконувались "apt-get update"?


24

Я знаю, що команда для оновлення списків сховищ є apt-get update.

Як перевірити, чи було воно виконано сьогодні або за останні 24 години?

Я не знаю, чи слід перевірити деяку часову позначку файлу. Або видайте іншу влучну команду. Або скористайтеся утилітою dpkg.

Не вдалося знайти щось корисне на сторінках man.

Відповіді:


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 терміналів, історія зберігається лише після їх виходу (за замовчуванням), тому вам доведеться перевірити їх усі.
hackel

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залишаються недоступними в деяких системах. Є нова пропозиція від derobert переглянути файл /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 хрип.
cavila

6
Краще було б місце резервного копіювання /var/cache/apt/pkgcache.bin. Крім того, будь ласка, не розбирайте результат ls; використовувати statзамість цього. Майте на увазі, що lsвихід залежить від місцевості, залежить від віку файлу тощо (також, я думаю, ви отримуєте лише перший запропонований файл, якщо встановлено поширене оновлення-сповіщувач)
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 , оскільки це, здається, є сирими, не кешованими даними, якими 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 виконував у базі даних пакетів, але afaik, про який хоче знати плакат apt-get update, і це, очевидно, не зареєстровано.
Faheem Mitha

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 гарантує, що пошук не ввійде у вміст каталогу.
  • -Hdereferences, /var/lib/apt/listsякщо це м'яке посилання
  • Якщо з якихось причин findне вдасться, тоді команда виконується. Мені це здається безпечним за замовчуванням. Якщо ви хочете перевернути за замовчуванням, використовуйте -nв тесті та -mtime +7команді find.

0

Я тільки що розмістив відповідь на це питання на наступну тему

Де я можу переглянути свою історію оновлень?

Відповідь може бути менш придатною для цієї теми, оскільки вона спеціально шукає "апт-отримати оновлення". Ось зразок виводу.

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.