Назад | Перейти на главную страницу

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

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

apt-get update

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

По крайней мере, в системах 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 / periodical / update-success-stamp, и если он у вас есть, вы можете использовать

stat -c %y /var/lib/apt/periodic/update-success-stamp

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

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

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

stat -c %Y /var/cache/apt/

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

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

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

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

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

$ ls -l /var/lib/dpkg/lock 
-rw-r----- 1 root root 0 2011-11-16 09:40 /var/lib/dpkg/lock

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

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

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

(find /var/lib/apt/periodic/update-success-stamp -mtime +1 | grep update-success-stamp) && (/usr/bin/apt-get update)

Он ищет файл штампа об успешном обновлении, который был изменен более одного дня назад. Если он находит файл подходящего возраста, он запускает обновление. Примечание: для этого должен существовать файл update-success-stamp.

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

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