48

I know that the command to update the repository lists is:

apt-get update

How to check if it has been executed today or in the last 24 hours?

I do not know if I should check some file timestamp. Or issue another apt command. Or use dpkg utility.

Could not find something useful at man pages.

galoget
  • 3,023
cavila
  • 603

13 Answers13

80

Check the time stamp of /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

Here the time is Jan 25 01:41 when apt-get last executed. To get the time only, use the following command in terminal,

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

It is the best place to check the last update time. If you found /var/lib/apt/periodic/ to be empty you can try,

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

Update

It is found that due to some reasons above files update-success-stamp or history.log remain unavailable in some systems. There is a new proposal from derobert to look into the file /var/cache/apt/pkgcache.bin.

pkgcache.bin is Apt's memory mapped package cache location. It get renewed after each update. So it is the perfect candidate to know the last time when apt was updated.

One can use the following command to know the exact time,

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

or

stat /var/cache/apt/pkgcache.bin
sourav c.
  • 46,120
19

You can check your command history in terminal :

history | grep 'apt update'

To check it by time :

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

(The [a] part of the regular expression only matches the letter a but has the effect to not match itself when grepping in the history.)

Terminal history with timestamp

Lorenz Keel
  • 9,511
nux
  • 39,152
8

I use /var/cache/apt to determine if I need to run apt-get update. By default, if the difference between the current time and cache time of /var/cache/apt is less than 24 hr, I don't need to run apt-get update. The default update interval can be overridden by passing a number to function runAptGetUpdate()

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
}

Sample Output:

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

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

I extracted these functions from my personal github: https://github.com/gdbtek/ubuntu-cookbooks/blob/master/libraries/util.bash

6

Combining @ssokolow's last comment with the answer from here, this command will run apt-get update if it hasn't run in the last 7 days:

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

Explanation:

  • -mtime -7 finds files that have a change time in the last 7 days. You can use -mmin if you care about shorter times.
  • -maxdepth 0 ensures find won't go into the contents of the directory.
  • -H dereferences /var/lib/apt/lists if it's a soft link
  • If for some reason find fails, then the command would run. This seems to me like the safe default. If you want to flip the default, use -n in the test and -mtime +7 in the find command.
itsadok
  • 2,934
4

In case anyone is interested, this is the way Ansible does it:

APT_UPDATE_SUCCESS_STAMP_PATH = "/var/lib/apt/periodic/update-success-stamp"
APT_LISTS_PATH = "/var/lib/apt/lists"

[...]

def get_cache_mtime(): """Return mtime of a valid apt cache file. Stat the apt cache file and if no cache file is found return 0 :returns: int """ cache_time = 0 if os.path.exists(APT_UPDATE_SUCCESS_STAMP_PATH): cache_time = os.stat(APT_UPDATE_SUCCESS_STAMP_PATH).st_mtime elif os.path.exists(APT_LISTS_PATH): cache_time = os.stat(APT_LISTS_PATH).st_mtime return cache_time

Per Lundberg
  • 163
  • 8
3
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
2

You can use this command to show last time it was accessed ie. running apt-get update also last time it was actually updated:

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

Note if the times are different there may not have been an update available. Since I have my updates and upgrades running by crontab at specific times I can tell if my updates ran or not.

galoget
  • 3,023
SCBB
  • 61
  • 6
1

The last-modified timestamp of /var/lib/apt/periodic/update-success-stamp is used to indicate the last time apt-get update was successfully run.

So to check if it's been more than 24 hours since we last ran apt-get update, use the following in Bash:

last_update=`stat -c %Y /var/lib/apt/periodic/update-success-stamp`
if [ $((`date +%s`-$last_update)) -gt $((24*60*60)) ]; then
  ...
fi

Explanation:

  • stat -c %Y /var/lib/apt/periodic/update-success-stamp gets the mtime timestamp (in seconds since Epoch) of the file.
  • date +%s gets the current time (in seconds since Epoch).
  • $((`date +%s`-$last_update)) calculates the difference, that is the number of seconds since the last successful apt-get update.
  • [ ... -gt $((24*60*60)) ] checks if this number is greater than the number of seconds in a day.
Jo Liss
  • 274
1

You may also interested about the file:

/var/log/apt/term.log

Open it with less or cat as root.

0

For apt specifically, I recommend this one-liner by @itsadok:

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

However If you want a more portable "update package manager at least every x days" semantics, you can simply touch a temp file when you update.

For example:

APT_UPDATED="/tmp/apt-update-tstamp"

Delete temp file created >1 day ago

find "$APT_UPDATED" -mtime +1 -exec rm {} ; 2>/dev/null

Update apt if needed

if [ ! -f "$APT_UPDATED" ]; then if apt-get update; then touch "$APT_UPDATED" fi fi

This should work in most scenarios since:

  • More updates wont hurt you (except time)
  • Doesn't rely on any apt internals (could expand to pkg, yum, etc)
galoget
  • 3,023
jchook
  • 216
0

This command will work:

stat -c %y /var/lib/apt/periodic/update-success-stamp
logbasex
  • 369
0

In Ubuntu 21.10 You can grep the history.log like this:

grep -i 'Start-Date' /var/log/apt/history.log | tail -n1
Start-Date: 2022-03-07  11:09:14

This command will return the very last date of the apt update command.

0

I just posted an answer to this question on following topic

Where can I look up my update history?

The answer may be less appropriate for this topic, as it specifically looks for "apt-get upgrade". Here's sample output.

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

See the other topic for source code and more explanation.

JsinJ
  • 41