Trova l'ultimo aggiornamento è stato eseguito con apt-get


30

Devo trovare l'ultima volta che il

apt-get update

il comando è stato eseguito sul mio server. Come posso determinare queste informazioni?

Risposte:


23

Almeno nei sistemi Ubuntu c'è un file /etc/apt/apt.conf.d/15update-stamp contenente:

APT::Update::Post-Invoke-Success {"touch /var/lib/apt/periodic/update-success-stamp 2>/dev/null || true";};

Quindi vedi se hai / var / lib / apt / periodic / update-success-stamp e se ce l'hai, puoi usare

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

comando per ottenere l'ora dell'ultima chiamata "apt-get update".

E se il tuo sistema non ha quel file di configurazione apt, puoi sempre aggiungerlo.


+1 per includere la riga apt.conf. Su Ubuntu 14.04 sembra che il file sia su/var/lib/apt/periodic/update-stamp
GnP

11

È possibile controllare i tempi di accesso sui file in / var / lib / apt / lists che viene aggiornato quando si esegue apt-get update. Se apt-get update è stato eseguito con sudo dovresti avere una riga loggata in /var/log/auth.log al termine.


2
Come sottolineato da qualche altra parte, è possibile che alcuni file non vengano aggiornati e quindi non siano stati nuovamente scaricati. Questo va bene se vuoi sapere quanto sono aggiornati i tuoi elenchi di pacchetti, ma non se vuoi sapere quando è stato eseguito l'ultimo aggiornamento di apt-get. Il primo è più probabile.
David Pashley,

10

Un apt-get updatenon possono creare o aggiornare i file, lo fa aggiornare la directory della cache in modo che possiamo utilizzare per ottenere che il timestamp quando l'ultimo apt-get updateè stato eseguito:

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

Si noti che l'installazione del pacchetto può anche aggiornare la directory della cache. Questo non è un controllo affidabile perapt-get update
GnP

3

Non passare dai file di blocco. I file di blocco non sono affidabili, tendono a spostarsi nel tempo con le nuove versioni di Linux e molti programmi puliscono (rimuovono) i file di blocco quando hanno finito con loro.

Il seguente comando ti darà quello che stai cercando.

ls -lt --time-style="long-iso" /var/log/apt | grep -o '\([0-9]\{2,4\}[- ]\)\{3\}[0-9]\{2\}:[0-9]\{2\}' -m 1

Sono due comandi in uno. I risultati del primo comando filtrano nel secondo tramite il simbolo pipe (|).

Nel primo comando, sto usando "ls" per elencare il contenuto del file della directory / var / log / apt, che è la directory che memorizza i registri della cronologia degli accessi per apt-get. La parte "-lt" è in realtà due interruttori. Il primo interruttore "l" dice a "ls" di elencare un file per riga con i dettagli. Il secondo interruttore "t" dice a "ls" di ordinare per data e ora. "--time-style" impone che l'ora della data venga visualizzata nel formato "AAAA-MM-GG HH: MM".

Nella parte "grep" del comando, l'opzione "-o" indica a grep di mostrare solo le porzioni di ciascuna riga che corrispondono esattamente all'espressione regolare. L'espressione regolare che ho usato qui rileva gli orari di data nel formato specificato nel comando "ls". Noterai anche il vero piccolo pezzo di magia proprio alla fine del comando "grep" che c'è un interruttore "-m" con il numero "1" immediatamente successivo. Questo dice a "grep" di smettere di cercare le partite dopo aver trovato la prima.

Quindi, in sintesi, stiamo elencando i dettagli del file di registro apt in modo da poter vedere l'ultima data modificata, quindi ordiniamo per data e diciamo a grep di estrarre la prima data dalla cima, che poi restituisce. Questa è l'ultima data in cui apt-get ha funzionato.

Per interpretare l'avvocato del diavolo per un momento, tuttavia, è comune per piattaforme Debian come Ubuntu programmare apt-get come un lavoro che viene eseguito regolarmente. Se stai cercando la persona all'altro capo dell'esecuzione di apt-get, potresti effettivamente trovare una macchina. È sempre possibile abbinare i registri di accesso ai registri apt per vedere se i timestamp coincidono. È anche possibile esaminare la cronologia dei comandi di un utente in una certa misura.

Spero che sia di aiuto!


1
Purtroppo non funziona. In /var/log/aptesso viene anche registrato quando ad esempio faccio un apt-get install some-package. In realtà su Ubuntu non registra qualcosa quando lo faccioapt-get update
Alex

2

Ho il sospetto che tu possa controllare gli ultimi tempi modificati su files / var / cache / apt per capire quando gli ultimi aggiornamenti sono stati applicati agli elenchi dei pacchetti.

Ho appena provato questo, ed eseguito "sudo apt-get update" due volte di seguito, e le date non sono cambiate rispetto al loro valore attuale, ma sospetto che ciò sia dovuto al fatto che non c'erano nuovi aggiornamenti da applicare e che le cache sono attive ad oggi.


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

1

Synaptic registra un file di cronologia (> File> Cronologia), aptitude registra sia la cronologia in / var / log / aptitude sia i pacchetti installati automaticamente in / var / lib / aptitude / pkgstates, in modo da poterli controllare per le ultime attività.


1

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 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


La risposta è incompleta Che cos'è infoe isEmptyString? Inoltre, infoè una scelta sbagliata del nome della funzione poiché è anche un comando. A parte questo, bella soluzione!
Ronny Andersson,


0

/var/log/dpkg.log manterrà una cronologia di ciò che è stato fatto, ma non necessariamente quale app chiamata dpkg (synaptic, apt-get, ecc.).


0

avvolgere apt-get in uno script che prima scrive un timestamp su un file, quindi fa il solito lavoro. in questo modo, puoi definire il formato e la posizione del timestamp;)


Goditi, avvolgerlo in uno script non è pratico se hai centinaia di server e non desideri conservare ancora un altro script che potrebbe causare problemi al prossimo aggiornamento del pacchetto apt-get. Penso che il richiedente stia cercando una risposta che faccia uso delle informazioni già esistenti nel suo computer.
pdwalker,

0

Ecco un semplice one-liner per eseguire un aggiornamento se non è stato eseguito nell'ultimo giorno.

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

Cerca il file update-success-stamp, che è stato modificato più di un giorno fa. Se trova il file della giusta età, quindi esegue l'aggiornamento. Nota: il file update-success-stamp deve esistere affinché funzioni.

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.