Jak się dowiedzieć, kiedy ostatnio wykonywano aktualizację „apt-get”?

24

Wiem, że polecenie aktualizacji list repozytoriów to apt-get update.

Jak sprawdzić, czy został wykonany dzisiaj, czy w ciągu ostatnich 24 godzin?

Nie wiem, czy powinienem sprawdzić znacznik czasu pliku. Lub wydaj inne polecenie apt. Lub użyj narzędzia dpkg.

Nie można znaleźć czegoś przydatnego na stronach podręcznika użytkownika.

Cavila
źródło

Odpowiedzi:

15

Możesz sprawdzić historię poleceń w terminalu:

history | grep 'apt update'

Aby to sprawdzić przez czas:

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

( [a]Część wyrażenia regularnego pasuje tylko do litery, aale powoduje, że nie pasuje do siebie podczas grepowania w historii).

wprowadź opis zdjęcia tutaj

Mam nadzieję, że to pomoże !

nux
źródło
2
Jest history | grep 'apt-get update':)
Lucio
7
@souravc ma rację. To nie zadziała samo. Jeśli HISTTIMEFORMATnie jest ustawione, .bashrcto polecenie będzie miało poprawne znaczniki czasu dla poleceń, które zostały faktycznie wykonane z bieżącej sesji powłoki . Dla wszystkich innych poleceń, które nie pochodzą z bieżącej sesji, znacznik czasu pokaże tylko znacznik czasu modyfikacji ~/.bash_historypliku. Nie może pokazywać znaczników czasu dla poleceń z innych sesji, ponieważ te znaczniki czasu nie są zapisywane w ~/.bash_historypliku. Może pokazywać znaczniki czasu dla bieżącej sesji, ponieważ te znaczki są nadal w pamięci.
sokolnik
7
To nie zawsze działa. Na przykład, gdy uruchomił się inny użytkownik aptlub gdy .bash_historyzostałeś przycięty.
OrangeTux
4
To jest strasznie zła odpowiedź. Nie uwzględnia uaktualnień nienadzorowanych, a jeśli jesteś kimś takim jak ja, który zawsze ma otwarte 4-5 terminali, historia jest zapisywana tylko wtedy, gdy wychodzą (domyślnie), więc musisz sprawdzić wszystkie.
hackel
3
Powtarzanie tego, co wszyscy już powiedzieli, nie zadziała, jeśli apt został zaktualizowany przez skrypt, jeśli nie patrzysz na właściwą historię, jeśli historia została przycięta lub jeśli inny użytkownik dokonał aktualizacji. To naprawdę nie jest wystarczająco niezawodne, aby rozwiązać ogólny przypadek.
zneak 25.09.17
54

Sprawdź znacznik czasu z /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

Tutaj jest czas, Jan 25 01:41kiedy apt-getostatnio wykonano. Aby uzyskać tylko czas, użyj następującego polecenia w terminalu,

$ ls -l /var/lib/apt/periodic/update-success-stamp | awk '{print $6" "$7" "$8}'
Jan 25 01:41

Jest to najlepsze miejsce, aby sprawdzić czas ostatniej aktualizacji. Jeśli /var/lib/apt/periodic/okaże się, że jest pusty, możesz spróbować,

ls -l /var/log/apt/history.log

Aktualizacja

Stwierdzono, że z pewnych powodów powyższe pliki update-success-stamplub history.logpozostają niedostępne w niektórych systemach. Jest to nowa propozycja od derobert zajrzeć do pliku /var/cache/apt/pkgcache.bin.

pkgcache.binjest lokalizacją pamięci podręcznej pakietu mapowanego przez Apt. Jest odnawiany po każdej aktualizacji. Jest to więc idealny kandydat, aby wiedzieć, kiedy ostatnio aptbył aktualizowany.

Można użyć następującego polecenia, aby poznać dokładny czas,

ls -l /var/cache/apt/pkgcache.bin | cut -d' ' -f6,7,8

lub

stat /var/cache/apt/pkgcache.bin
souravc
źródło
mój /var/lib/apt/periodic/katalog jest pusty
virtualxtc
Mój katalog jest również pusty. Debian 7.3 wheezy.
cavila
6
Lepsza byłaby lokalizacja kopii zapasowej /var/cache/apt/pkgcache.bin. Proszę również nie analizować danych wyjściowych ls; użyj statzamiast tego. Należy pamiętać, że lsdane wyjściowe zależą od ustawień regionalnych, zależą od wieku pliku itp. (
Wydaje
2
Wydaje się, że dotyczy /var/cache/apt/pkgcache.binto również instalacji pakietu, więc nie jest to niezawodny sposób na sprawdzenie ostatniego apt-get updateuruchomienia.
GnP
3
... i właśnie odkryłem, że system Debian 8, w którym apt-get cleanbył ostatnio uruchamiany, nie będzie miał /var/cache/apt/pkgcache.bin. /var/lib/apt/listsZamiast tego spróbuję użyć mtime , ponieważ wydaje się, że są to surowe, niebuforowane dane, które apt-get updatefaktycznie manipulują.
ssokolow
6

Używam, /var/cache/aptaby ustalić, czy muszę uruchomić apt-get update. Domyślnie, jeśli różnica między bieżącym czasem a czasem buforowania /var/cache/aptwynosi mniej niż 24 godziny, nie muszę uruchamiać apt-get update. Domyślny interwał aktualizacji można zastąpić, przekazując liczbę do funkcjirunAptGetUpdate()

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
}

Przykładowe dane wyjściowe:

<root@ubuntu><~/ubuntu-cookbooks/libraries>
# runAptGetUpdate 

Skip apt-get update because its last run was '0h 37m 43s' ago

Wyodrębniłem te funkcje z mojego osobistego github: https://github.com/gdbtek/ubuntu-cookbooks/blob/master/libraries/util.bash

Nam Nguyen
źródło
2

Możesz być także zainteresowany plikiem:

/var/log/apt/term.log

Otwórz go z mniej lub cat jako root .

Abdelraouf Adjal
źródło
Jest to rozsądne miejsce do sprawdzania dzienników działań, które apt wykonał w bazie danych pakietów, ale afaik, o którym plakat chce wiedzieć apt-get update, i oczywiście nie jest rejestrowany.
Faheem Mitha
1

Używam tego polecenia

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

aby pokazać, kiedy ostatnio uzyskano dostęp, tj. uruchomienie „apt-get update” również podczas ostatniej aktualizacji.

Uwaga: jeśli czasy są inne, być może aktualizacja nie była dostępna. Ponieważ mam aktualizacje i aktualizacje uruchamiane przez crontab w określonych momentach, mogę stwierdzić, czy moje aktualizacje zostały uruchomione, czy nie.

SCBB
źródło
1

Łącząc ostatni komentarz @ ssokołow z odpowiedzią tutaj , to polecenie zostanie uruchomione, apt-get updatejeśli nie zadziałało w ciągu ostatnich 7 dni:

[ -z "$(find -H /var/lib/apt/lists -maxdepth 0 -mtime -7)" ] && sudo apt-get update

Wyjaśnienie:

  • -mtime -7wyszukuje pliki, które mają czas zmiany w ciągu ostatnich 7 dni. Możesz użyć, -mminjeśli zależy Ci na krótszych czasach.
  • -maxdepth 0 zapewnia, że ​​find nie przejdzie do zawartości katalogu.
  • -Hdereferencje, /var/lib/apt/listsjeśli jest to miękki link
  • Jeśli z jakiegoś powodu findnie powiedzie się, polecenie zostanie uruchomione. Wydaje mi się, że to bezpieczne ustawienie domyślne. Jeśli chcesz zmienić domyślną wartość, użyj -nw teście i -mtime +7w poleceniu find.
itsadok
źródło
0

Właśnie opublikowałem odpowiedź na to pytanie na następujący temat

Gdzie mogę sprawdzić historię aktualizacji?

Odpowiedź może być mniej odpowiednia w tym temacie, ponieważ dotyczy „apt-get upgrade”. Oto przykładowe dane wyjściowe.

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

Zobacz inny temat, aby uzyskać kod źródłowy i dodatkowe wyjaśnienia.

JsinJ
źródło
Wydawało mi się, że Twój kod szuka aktualizacji, a nie aktualizacji. Na przykład uruchomiłem „aktualizację apt-get” (temat tego pytania) na moim Ubuntu 16.04 i nie ma ani jednej zmiany w / var / log / apt, co oznacza, że ​​skanowanie czegokolwiek w tym katalogu nie będzie przydatne w odpowiedzi na to pytanie.
Ron Burk
1
Masz całkowitą rację. Dzięki za zwrócenie na to uwagi. Zmieniłem odpowiedź, aby to odzwierciedlić. Szukaliśmy ostatnich aktualizacji, które zostały zastosowane na komputerze, a nie tylko aktualizacji.
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
mikeytown2
źródło