Come sapere l'ultima volta che è stato eseguito `apt-get update`?


24

So che il comando per aggiornare gli elenchi dei repository è apt-get update.

Come verificare se è stato eseguito oggi o nelle ultime 24 ore?

Non so se dovrei controllare qualche timestamp del file. O emettere un altro comando apt. Oppure usa l'utilità dpkg.

Impossibile trovare qualcosa di utile nelle pagine man.

Risposte:


15

È possibile controllare la cronologia dei comandi nel terminale:

history | grep 'apt update'

Per verificarlo in tempo:

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

(La [a]parte dell'espressione regolare corrisponde solo alla lettera ama ha l'effetto di non corrispondere a se stessa quando si aggancia nella storia.)

inserisci qui la descrizione dell'immagine

Spero che sia d'aiuto !


2
È history | grep 'apt-get update':)
Lucio,

7
@souravc ha ragione. Questo non funzionerà da solo. Se HISTTIMEFORMATnon è impostato, .bashrcquesto comando avrà solo i timestamp corretti per i comandi che sono stati effettivamente eseguiti dalla sessione di shell corrente . Per tutti gli altri comandi che non provengono dalla sessione corrente, il timestamp mostrerà solo il timestamp di modifica del ~/.bash_historyfile. Non può mostrare i timestamp per i comandi di altre sessioni poiché tali timestamp non vengono salvati nel ~/.bash_historyfile. Può mostrare i timestamp per la sessione corrente perché quei timbri sono ancora in memoria.
falconiere

7
Questo non funziona sempre. Ad esempio quando un altro utente ha eseguito apto quando il tuo .bash_historyè stato tagliato.
OrangeTux,

4
Questa è una risposta terribilmente sbagliata. Non tiene conto degli aggiornamenti non presidiati, inoltre se sei come me che ha sempre 4-5 terminali aperti, la cronologia viene salvata solo quando escono (per impostazione predefinita), quindi dovresti controllarli tutti.
hackel,

3
Facendo eco a ciò che tutti hanno già detto, non funzionerà se apt è stato aggiornato da uno script, se non stai guardando la cronologia giusta, se la cronologia è stata ritagliata o se un altro utente ha effettuato l'aggiornamento. Non è abbastanza affidabile per risolvere il caso generale.
zneak,

54

Controllare il timestamp di /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

Qui il tempo è Jan 25 01:41quando apt-getl'ultima eseguita. Per ottenere solo l'ora, utilizzare il seguente comando nel terminale,

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

È il posto migliore per controllare l'ora dell'ultimo aggiornamento. Se hai trovato /var/lib/apt/periodic/vuoto, puoi provare,

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

Aggiornare

Si è scoperto che a causa di alcuni motivi sopra i file update-success-stampo history.logrimangono non disponibili in alcuni sistemi. C'è una nuova proposta di derobert per esaminare il file /var/cache/apt/pkgcache.bin.

pkgcache.binè la posizione della cache del pacchetto mappata in memoria di Apt. Viene rinnovato dopo ogni aggiornamento. Quindi è il candidato perfetto per conoscere l'ultima volta in cui è aptstato aggiornato.

Si può usare il seguente comando per conoscere l'ora esatta,

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

o

stat /var/cache/apt/pkgcache.bin

la mia /var/lib/apt/periodic/directory è vuota
virtualxtc il

Anche la mia directory è vuota. Debian 7.3 wheezy.
cavila,

6
Una posizione di backup migliore sarebbe /var/cache/apt/pkgcache.bin. Inoltre, per favore non analizzare l'output di ls; usa statinvece. Tieni presente che l' lsoutput dipende dalle impostazioni locali, dipende dall'età del file, ecc. (Inoltre, penso che otterrai solo il primo file che suggerisci se hai installato update-notifier-common)
derobert

2
Sembra che /var/cache/apt/pkgcache.binsia toccato anche dall'installazione del pacchetto, quindi non è un modo affidabile per verificare l'ultima apt-get updateesecuzione.
GnP

3
... e ho appena scoperto che un sistema Debian 8 dove apt-get cleanè stato eseguito di recente non avrà /var/cache/apt/pkgcache.bin. Proverò invece a usare mtime da /var/lib/apt/lists, dal momento che sembrano essere i dati grezzi, non memorizzati nella cache, che in apt-get updaterealtà manipolano.
ssokolow,

6

Uso /var/cache/aptper determinare se devo eseguire apt-get update. Per impostazione predefinita, se la differenza tra l'ora corrente e l'ora della cache /var/cache/aptè inferiore a 24 ore, non è necessario eseguire apt-get update. L'intervallo di aggiornamento predefinito può essere ignorato passando un numero alla funzionerunAptGetUpdate()

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
}

Uscita campione:

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

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

Ho estratto queste funzioni dal mio github personale: https://github.com/gdbtek/ubuntu-cookbooks/blob/master/libraries/util.bash


2

Potresti anche essere interessato al file:

/var/log/apt/term.log

Aprilo con less o cat come root .


Questo è un posto ragionevole per verificare la presenza di registri delle azioni eseguite da apt sul database del pacchetto, ma a quanto pare il poster vuole sapere apt-get updatee che ovviamente non è registrato.
Faheem Mitha,

1

Io uso questo comando

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

per mostrare l'ultima volta che è stato effettuato l'accesso, ad es. eseguendo 'apt-get update' anche l'ultima volta che è stato effettivamente aggiornato.

nota se i tempi sono diversi potrebbe non essere stato disponibile un aggiornamento. Dal momento che ho i miei aggiornamenti e aggiornamenti eseguiti da crontab in momenti specifici, posso dire se i miei aggiornamenti sono stati eseguiti o meno.


1

Combinando l'ultimo commento di @ssokolow con la risposta da qui , questo comando verrà eseguito apt-get updatese non è stato eseguito negli ultimi 7 giorni:

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

Spiegazione:

  • -mtime -7trova i file che hanno un orario di modifica negli ultimi 7 giorni. Puoi usarlo -mminse ti interessano tempi più brevi.
  • -maxdepth 0 assicura che find non vada nel contenuto della directory.
  • -Hdereferenze /var/lib/apt/listsse si tratta di un collegamento software
  • Se per qualche motivo findfallisce, il comando verrebbe eseguito. Questo mi sembra il default sicuro. Se si desidera invertire il valore predefinito, utilizzare -nnel test e -mtime +7nel comando trova.

0

Ho appena pubblicato una risposta a questa domanda sul seguente argomento

Dove posso cercare la mia cronologia degli aggiornamenti?

La risposta potrebbe essere meno appropriata per questo argomento, in quanto cerca specificamente "apt-get upgrade". Ecco un esempio di output.

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

Vedi l'altro argomento per il codice sorgente e ulteriori spiegazioni.


Mi sembrava che il tuo codice cercasse l'aggiornamento, non l'aggiornamento. Ad esempio, ho appena eseguito "apt-get update" (oggetto di questa domanda) sul mio Ubuntu 16.04 e non appare una iota di cambiamento in / var / log / apt, il che implica che la scansione di qualsiasi cosa in quella directory non sarà di alcuna utilità in risposta a questa particolare domanda.
Ron Burk,

1
Hai perfettamente ragione. Grazie per la segnalazione. Ho cambiato la mia risposta per riflettere questo. Stavamo cercando l'ultima data in cui sono stati applicati gli aggiornamenti alla macchina, anziché gli aggiornamenti appena scaricati.
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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.