Làm sao để biết lần cuối `apt-get update` được thực thi?


24

Tôi biết rằng lệnh để cập nhật danh sách kho lưu trữ là apt-get update.

Làm thế nào để kiểm tra xem nó đã được thực hiện hôm nay hay trong 24 giờ qua chưa?

Tôi không biết nếu nên kiểm tra một số dấu thời gian tập tin. Hoặc ban hành một lệnh apt khác. Hoặc sử dụng tiện ích dpkg.

Không thể tìm thấy một cái gì đó hữu ích tại các trang người đàn ông.

Câu trả lời:


15

Bạn có thể kiểm tra lịch sử lệnh của mình trong terminal:

history | grep 'apt update'

Để kiểm tra nó theo thời gian:

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

(Phần [a]của biểu thức chính quy chỉ khớp với chữ cái anhưng có tác dụng không khớp với chính nó khi grepping trong lịch sử.)

nhập mô tả hình ảnh ở đây

Hy vọng nó giúp !


2
Đó là history | grep 'apt-get update':)
Lucio

7
@souravc nói đúng. Điều này sẽ không tự làm việc. Nếu HISTTIMEFORMATkhông được đặt .bashrcthì lệnh này sẽ chỉ có dấu thời gian chính xác cho các lệnh thực sự được thực hiện từ phiên shell hiện tại . Đối với tất cả các lệnh khác không phải từ phiên hiện tại, dấu thời gian sẽ chỉ hiển thị dấu thời gian sửa đổi của ~/.bash_historytệp. Nó không thể hiển thị dấu thời gian cho các lệnh từ các phiên khác vì các dấu thời gian đó không được lưu trong ~/.bash_historytệp. Nó có thể hiển thị dấu thời gian cho phiên hiện tại vì những con tem đó vẫn còn trong bộ nhớ.
chim ưng

7
Điều này không phải lúc nào cũng hoạt động. Ví dụ: khi một số người dùng khác chạy apthoặc khi bạn .bash_historyđã bị cắt.
OrangeTux

4
Đây là một câu trả lời sai lầm khủng khiếp. Nó không tính đến các nâng cấp không giám sát, cộng với nếu bạn là người như tôi luôn mở 4-5 thiết bị đầu cuối, lịch sử chỉ được lưu khi chúng thoát (theo mặc định), vì vậy bạn sẽ phải kiểm tra tất cả chúng.
hackel

3
Báo lại những gì mọi người đã nói, sẽ không hoạt động nếu apt được cập nhật bởi tập lệnh, nếu bạn không nhìn đúng lịch sử, nếu lịch sử đã được cắt bớt hoặc nếu người dùng khác thực hiện cập nhật. Điều đó thực sự không đủ tin cậy để giải quyết trường hợp chung.
zneak

54

Kiểm tra dấu thời gian của /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

Ở đây thời gian là Jan 25 01:41khi apt-getthực hiện lần cuối. Để chỉ lấy thời gian, sử dụng lệnh sau trong terminal,

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

Đây là nơi tốt nhất để kiểm tra thời gian cập nhật cuối cùng. Nếu bạn thấy /var/lib/apt/periodic/trống rỗng, bạn có thể thử,

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

Cập nhật

Nó được tìm thấy rằng do một số lý do trên các tập tin update-success-stamphoặc history.logvẫn không có sẵn trong một số hệ thống. Có một đề xuất mới từ derobert để xem xét các tập tin /var/cache/apt/pkgcache.bin.

pkgcache.binlà vị trí bộ nhớ cache của gói bộ nhớ của Apt. Nó được gia hạn sau mỗi lần cập nhật. Vì vậy, nó là ứng cử viên hoàn hảo để biết lần cuối khi aptđược cập nhật.

Người ta có thể sử dụng lệnh sau để biết thời gian chính xác,

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

hoặc là

stat /var/cache/apt/pkgcache.bin

/var/lib/apt/periodic/thư mục của tôi trống
virtualxtc

Thư mục của tôi cũng trống rỗng. Debian 7.3 khò khè.
cavila

6
Một vị trí sao lưu tốt hơn sẽ là /var/cache/apt/pkgcache.bin. Ngoài ra, xin đừng phân tích đầu ra của ls; sử dụng statthay thế. Hãy nhớ rằng lsđầu ra phụ thuộc vào miền địa phương, phụ thuộc vào tuổi của tệp, v.v. (Ngoài ra, tôi nghĩ rằng bạn chỉ nhận được tệp đầu tiên mà bạn đề xuất nếu bạn đã cài đặt bản cập nhật-trình thông báo chung)
derobert

2
Có vẻ như /var/cache/apt/pkgcache.bincũng được chạm vào cài đặt gói, vì vậy đây không phải là cách đáng tin cậy để kiểm tra lần apt-get updatechạy cuối cùng .
GnP

3
... Và tôi mới phát hiện ra rằng một hệ thống Debian 8 apt-get cleanđã được chạy gần đây sẽ không có /var/cache/apt/pkgcache.bin. /var/lib/apt/listsThay vào đó, tôi sẽ thử sử dụng mtime , vì đó dường như là dữ liệu thô, không được lưu trong bộ nhớ cache apt-get updatethực sự thao túng.
ssokolow

6

Tôi sử dụng /var/cache/aptđể xác định nếu tôi cần phải chạy apt-get update. Theo mặc định, nếu chênh lệch giữa thời gian hiện tại và thời gian bộ đệm /var/cache/aptlà dưới 24 giờ, tôi không cần phải chạy apt-get update. Khoảng thời gian cập nhật mặc định có thể được ghi đè bằng cách chuyển một số cho hàmrunAptGetUpdate()

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
}

Đầu ra mẫu:

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

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

Tôi đã trích xuất các chức năng này từ github cá nhân của mình: https://github.com/gdbtek/ubfox-cookbooks/blob/master/lologists/util.bash


2

Bạn cũng có thể quan tâm đến các tập tin:

/var/log/apt/term.log

Mở nó với ít hoặc mèoroot .


Đây là một nơi hợp lý để kiểm tra nhật ký hành động mà apt đã thực hiện trên cơ sở dữ liệu gói, nhưng người đăng muốn biết về apt-get updateđiều đó và rõ ràng là không được ghi lại.
Faheem Mitha

1

Tôi sử dụng lệnh này

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

để hiển thị lần cuối nó đã được truy cập tức là. chạy 'apt-get update' lần cuối cùng nó thực sự được cập nhật.

lưu ý nếu thời gian khác nhau thì có thể không có bản cập nhật. Vì tôi có các bản cập nhật và nâng cấp đang chạy bởi crontab vào những thời điểm cụ thể nên tôi có thể biết liệu các bản cập nhật của mình có chạy hay không.


1

Kết hợp nhận xét cuối cùng của @ ssokolow với câu trả lời từ đây , lệnh này sẽ chạy apt-get updatenếu nó không chạy trong 7 ngày qua:

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

Giải trình:

  • -mtime -7tìm thấy các tệp có thời gian thay đổi trong 7 ngày qua. Bạn có thể sử dụng -mminnếu bạn quan tâm về thời gian ngắn hơn.
  • -maxdepth 0 đảm bảo tìm thấy sẽ không đi vào nội dung của thư mục.
  • -Hhội nghị /var/lib/apt/listsnếu đó là một liên kết mềm
  • Nếu vì lý do nào đó findkhông thành công, thì lệnh sẽ chạy. Điều này đối với tôi như mặc định an toàn. Nếu bạn muốn lật mặc định, sử dụng -ntrong kiểm tra và -mtime +7trong lệnh find.

0

Tôi chỉ đăng một câu trả lời cho câu hỏi này về chủ đề sau

Tôi có thể tra cứu lịch sử cập nhật của mình ở đâu?

Câu trả lời có thể ít phù hợp hơn với chủ đề này, vì nó đặc biệt tìm kiếm "nâng cấp apt-get". Đây là đầu ra mẫu.

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

Xem chủ đề khác cho mã nguồn và giải thích thêm.


Nó trông giống như mã của bạn tìm nâng cấp, không cập nhật. Ví dụ: tôi chỉ chạy "apt-get update" (chủ đề của câu hỏi này) trên Ubuntu 16.04 của tôi và không có một iota thay đổi nào xuất hiện trong / var / log / apt, ngụ ý rằng việc quét bất cứ thứ gì trong thư mục đó sẽ không được sử dụng trong câu trả lời đặc biệt này
Ron Burk

1
Bạn hoàn toàn đúng. Cảm ơn đã chỉ ra rằng. Tôi đã thay đổi câu trả lời của mình để phản ánh điều đó. Chúng tôi đang tìm kiếm các bản cập nhật ngày cuối cùng được áp dụng cho máy, thay vì các bản cập nhật mới được tải xuống.
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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.