Найти последнее время обновление было выполнено с помощью apt-get

30

Мне нужно найти последний раз, когда

apt-get update

Команда была выполнена на моем сервере. Как я могу определить эту информацию?

Марк Родди
источник

Ответы:

23

По крайней мере, в системах 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».

И если ваша система не имеет этого файла конфигурации, вы всегда можете добавить его.

Туомас
источник
+1 за включение строки apt.conf. На Ubuntu 14.04 кажется, что файл находится на/var/lib/apt/periodic/update-stamp
GnP
11

Вы можете проверить время доступа к файлам в / var / lib / apt / lists, которая обновляется при запуске apt-get update. Если обновление apt-get было запущено с помощью sudo, вы должны зарегистрировать строку в /var/log/auth.log, когда это будет сделано.

rkthkr
источник
2
Как указано в другом месте, вы можете обнаружить, что некоторые файлы не обновляются и, следовательно, не загружаются снова. Это хорошо, если вы хотите знать, насколько актуальны ваши списки пакетов, но не хотите знать, когда последний раз выполнялось обновление apt-get. Первое более вероятно.
Дэвид Пашли
10

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

stat -c %Y /var/cache/apt/
Ханс Ламбермонт
источник
Обратите внимание, что установка пакета может также обновить каталог кэша. Это не надежная проверка дляapt-get update
GnP
3

Не уходи от файлов блокировки. Файлы блокировки не надежны, они имеют тенденцию перемещаться с течением времени с новыми выпусками 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» заставляет дату и время отображаться в формате «ГГГГ-ММ-ДД ЧЧ: ММ».

В части команды "grep" ключ "-o" указывает grep показывать только те части каждой строки, которые точно соответствуют регулярному выражению. Регулярное выражение, которое я здесь использовал, определяет время даты в формате, указанном в команде "ls". В самом конце команды «grep» вы также заметите настоящий маленький кусочек магии: здесь есть ключ «-m», за которым следует цифра «1». Это говорит "grep" прекратить поиск совпадений после того, как он найдет первый.

Итак, в итоге, мы перечисляем подробности файла журнала apt, чтобы мы могли видеть дату последнего изменения, затем сортируем по дате и говорим grep, чтобы вытащить первую дату сверху, которую она затем возвращает. Это последнее свидание, которое провёл apt-get.

Однако, чтобы на мгновение сыграть в защиту дьявола, платформы Debian, такие как Ubuntu, часто планируют apt-get как работу, которая выполняется регулярно. Если вы ищете человека на другом конце выполнения apt-get, вы можете найти машину. Вы всегда можете сопоставить журналы доступа с журналами apt, чтобы увидеть, совпадают ли какие-либо временные метки. Также возможно посмотреть историю команд пользователя в некоторой степени.

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

Аарон Беловский
источник
1
К сожалению, не работает. В /var/log/aptэто также регистрируется, когда я например делаю apt-get install some-package. На самом деле на Ubuntu он не регистрирует что-то, когда я делаюapt-get update
Alex
2

Я подозреваю, что вы можете проверить последние изменения в файлах / var / cache / apt, чтобы выяснить, когда последние обновления были применены к спискам пакетов.

Я только что проверил это и дважды выполнил команду «sudo apt-get update», и даты не изменились по сравнению с их текущим значением, но я подозреваю, что это потому, что не было новых обновлений, которые нужно применить, и что кэши работают встретиться.

slacy
источник
1
$ ls -l /var/lib/dpkg/lock 
-rw-r----- 1 root root 0 2011-11-16 09:40 /var/lib/dpkg/lock
user104833
источник
1

Synaptic регистрирует файл истории (> Файл> История), aptitude записывает историю как в / var / log / aptitude, так и автоматически установленные пакеты в / var / lib / aptitude / pkgstates, так что вы можете проверить их на предмет последних действий.

Джош Брауэр
источник
1

Я использую, /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это плохой выбор имени функции, так как это также команда. Помимо этого, хорошее решение!
Ронни Андерссон
@RonnyAndersson, все в этой библиотеки: github.com/gdbtek/ubuntu-cookbooks/blob/master/libraries/...
Нам Нгуен
0

/var/log/dpkg.log будет хранить историю того, что было сделано, но не обязательно, какое приложение называется dpkg (synaptic, apt-get и т. д.).

Джонатан
источник
0

Оберните apt-get в скрипт, который сначала записывает метку времени в файл, а затем выполняет обычную работу. таким образом, вы можете определить формат и местоположение метки времени;)

Sujoy
источник
Sujoy, Оборачивать его в скрипт нецелесообразно, если у вас есть сотни серверов, и вы не хотите поддерживать еще один скрипт, который может вызвать проблемы при следующем обновлении пакета apt-get. Я думаю, что запросчик ищет ответ, который использует информацию, уже существующую на его компьютере.
pdwalker
0

Вот простой однострочный инструмент для запуска обновления, если оно не было запущено в последний день.

(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 должен существовать, чтобы это работало.

Кристиан Лонг
источник