จะทราบได้อย่างไรว่ามีการใช้งาน `apt-get update` ครั้งล่าสุด?


24

apt-get updateฉันรู้ว่าคำสั่งเพื่อปรับปรุงรายการที่เก็บอยู่ใน

วิธีการตรวจสอบว่ามันถูกดำเนินการในวันนี้หรือใน 24 ชั่วโมงที่ผ่านมา?

ฉันไม่ทราบว่าควรตรวจสอบการประทับเวลาของไฟล์หรือไม่ หรือออกคำสั่ง apt อื่น หรือใช้ยูทิลิตี dpkg

ไม่พบสิ่งที่มีประโยชน์ในหน้าคน

คำตอบ:


15

คุณสามารถตรวจสอบประวัติคำสั่งของคุณใน terminal:

history | grep 'apt update'

วิธีตรวจสอบตามเวลา:

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

( [a]ส่วนหนึ่งของการแสดงออกปกติตรงกับตัวอักษรaแต่มีผลกระทบที่จะไม่ตรงกับตัวเองเมื่อ grepping ในประวัติศาสตร์)

ป้อนคำอธิบายรูปภาพที่นี่

หวังว่ามันจะช่วย!


2
มันเป็นhistory | grep 'apt-get update':)
Lucio

7
@souravc ถูกต้อง สิ่งนี้จะไม่ได้ผล หากHISTTIMEFORMATไม่ได้ตั้งค่าไว้.bashrcคำสั่งนี้จะมีการประทับเวลาที่ถูกต้องสำหรับคำสั่งที่ดำเนินการจริงจากเซสชันเชลล์ปัจจุบันเท่านั้น สำหรับคำสั่งอื่น ๆ ทั้งหมดที่ไม่ได้มาจากเซสชันปัจจุบันการประทับเวลาจะแสดงเฉพาะการประทับเวลาการแก้ไขของ~/.bash_historyไฟล์ ไม่สามารถแสดงการประทับเวลาสำหรับคำสั่งจากเซสชันอื่นเนื่องจากการประทับเวลาเหล่านั้นจะไม่ถูกบันทึกใน~/.bash_historyไฟล์ สามารถแสดงการประทับเวลาสำหรับเซสชันปัจจุบันเนื่องจากการประทับเหล่านั้นยังคงอยู่ในหน่วยความจำ
falconer

7
สิ่งนี้ไม่ได้ผลเสมอไป เช่นเมื่อผู้ใช้รายอื่นวิ่งaptหรือเมื่อคุณ.bash_historyถูกตัดแต่ง
OrangeTux

4
นี่เป็นคำตอบที่ผิดมาก มันไม่ได้หมายถึงการอัปเกรดแบบไม่ต้องใส่ข้อมูลรวมถึงถ้าคุณเป็นคนอย่างฉันที่เปิดเทอร์มินัล 4-5 ครั้งประวัติจะได้รับการบันทึกเมื่อพวกเขาออกเท่านั้น (โดยค่าเริ่มต้น) ดังนั้นคุณจะต้องตรวจสอบทั้งหมด
hackel

3
สะท้อนสิ่งที่ทุกคนพูดไปแล้วว่าจะไม่ทำงานหากสคริปต์ได้รับการอัปเดต apt หากคุณไม่ได้ดูประวัติที่ถูกต้องหากประวัติถูกตัดหรือผู้ใช้รายอื่นทำการอัปเดต ไม่น่าเชื่อถือเพียงพอที่จะแก้ปัญหากรณีทั่วไป
zneak

54

/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

นี่คือเวลาที่Jan 25 01:41เมื่อapt-getดำเนินการที่ผ่านมา เพื่อให้ได้เวลาเท่านั้นให้ใช้คำสั่งต่อไปนี้ในเทอร์มินัล

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

เป็นสถานที่ที่ดีที่สุดในการตรวจสอบเวลาอัปเดตครั้งล่าสุด หากคุณพบว่า/var/lib/apt/periodic/ว่างเปล่าคุณสามารถลอง

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

ปรับปรุง

พบว่าเนื่องจากเหตุผลบางประการข้างต้นไฟล์update-success-stampหรือhistory.logยังไม่พร้อมใช้งานในบางระบบ มีใหม่เป็นข้อเสนอจากderobert/var/cache/apt/pkgcache.binจะมองเข้าไปในแฟ้ม

pkgcache.binเป็นตำแหน่งแคชแพ็กเกจหน่วยความจำของ Apt มันจะได้รับการต่ออายุหลังจากการอัพเดทแต่ละครั้ง ดังนั้นจึงเป็นผู้สมัครที่สมบูรณ์แบบที่จะรู้ว่าครั้งสุดท้ายที่aptมีการอัปเดต

สามารถใช้คำสั่งต่อไปนี้เพื่อทราบเวลาที่แน่นอน

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

หรือ

stat /var/cache/apt/pkgcache.bin

/var/lib/apt/periodic/ไดเรกทอรีของฉันว่างเปล่า
virtualxtc

ไดเรกทอรีของฉันยังว่างเปล่า Debian 7.3 wheezy
cavila

6
ตำแหน่งสำรองที่ดีกว่า/var/cache/apt/pkgcache.binคือ นอกจากนี้โปรดอย่าแยกวิเคราะห์ผลลัพธ์ของls; ใช้statแทน โปรดทราบว่าlsผลลัพธ์จะขึ้นอยู่กับสถานที่ตั้งขึ้นอยู่กับอายุของไฟล์ ฯลฯ (นอกจากนี้ฉันคิดว่าคุณจะได้รับไฟล์แรกที่คุณแนะนำถ้าคุณติดตั้งตัวแจ้งเตือนทั่วไปเท่านั้น)
Derobert

2
ดูเหมือนว่า/var/cache/apt/pkgcache.binจะมีการสัมผัสกับการติดตั้งแพ็คเกจดังนั้นจึงไม่ใช่วิธีที่เชื่อถือได้ในการตรวจสอบการapt-get updateทำงานล่าสุด
GnP

3
... และฉันก็ค้นพบว่า Debian 8 ระบบที่apt-get cleanได้รับการเรียกใช้เมื่อเร็ว ๆ /var/cache/apt/pkgcache.binนี้จะไม่มี ฉันจะลองใช้ mtime /var/lib/apt/listsแทนแทนเนื่องจากดูเหมือนว่าจะเป็นข้อมูลดิบและไม่ใช่แคชซึ่งใช้งานได้apt-get updateจริง
ssokolow

6

ฉันใช้เพื่อตรวจสอบว่าฉันจำเป็นต้องใช้/var/cache/apt apt-get updateโดยค่าเริ่มต้นถ้าความแตกต่างระหว่างเวลาปัจจุบันและเวลาแคชของ/var/cache/aptน้อยกว่า 24 apt-get updateชั่วโมงผมไม่จำเป็นต้องวิ่ง ช่วงเวลาการอัพเดทเริ่มต้นสามารถเขียนทับได้โดยส่งผ่านตัวเลขไปยังฟังก์ชัน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
}

ตัวอย่างผลลัพธ์:

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

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

ฉันแยกฟังก์ชั่นเหล่านี้ออกมาจาก github ส่วนตัวของฉัน: https://github.com/gdbtek/ubuntu-cookbooks/blob/master/lไลบรารี/util.bash


2

คุณอาจสนใจเกี่ยวกับไฟล์:

/var/log/apt/term.log

เปิดด้วยน้อยหรือแมวเป็นราก


นี่เป็นสถานที่ที่เหมาะสมในการตรวจสอบบันทึกการดำเนินการที่ทำบนฐานข้อมูลแพคเกจ แต่สิ่งที่ผู้โพสต์ต้องการทราบapt-get updateและเห็นได้ชัดว่าไม่ได้ถูกบันทึกไว้
Faheem Mitha

1

ฉันใช้คำสั่งนี้

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

เพื่อแสดงครั้งล่าสุดที่มีการเข้าถึงเช่น ใช้งาน 'apt-get update' และครั้งล่าสุดที่มีการอัพเดทจริง

โปรดทราบว่าเวลาต่างกันอาจไม่มีการอัปเดต เนื่องจากฉันมีการอัปเดตและการอัปเกรดที่รันโดย crontab ในบางช่วงเวลาฉันจึงสามารถบอกได้ว่าการอัปเดตของฉันรันหรือไม่


1

การรวมความคิดเห็นล่าสุดของ @ ssokolow กับคำตอบจากที่นี่คำสั่งนี้จะทำงานapt-get updateหากไม่ได้ทำงานใน 7 วันที่ผ่านมา:

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

คำอธิบาย:

  • -mtime -7ค้นหาไฟล์ที่มีเวลาเปลี่ยนแปลงใน 7 วันล่าสุด คุณสามารถใช้-mminหากคุณสนใจเวลาที่สั้นลง
  • -maxdepth 0 ตรวจสอบให้แน่ใจว่าการค้นหาจะไม่เข้าไปในเนื้อหาของไดเรกทอรี
  • -Hdereferences /var/lib/apt/listsหากเป็นลิงค์อ่อน
  • หากด้วยเหตุผลบางอย่างfindล้มเหลวคำสั่งจะทำงาน ดูเหมือนว่าฉันจะชอบค่าเริ่มต้นที่ปลอดภัย หากคุณต้องการพลิกค่าเริ่มต้นให้ใช้-nในการทดสอบและ-mtime +7ในคำสั่ง find

0

ฉันเพิ่งโพสต์คำตอบสำหรับคำถามนี้ในหัวข้อต่อไป

ฉันจะค้นหาประวัติการอัพเดทของฉันได้ที่ไหน

คำตอบอาจไม่เหมาะสมสำหรับหัวข้อนี้เนื่องจากจะหาเฉพาะ "apt-get upgrade" นี่คือตัวอย่างผลลัพธ์

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

ดูหัวข้ออื่น ๆ สำหรับซอร์สโค้ดและคำอธิบายเพิ่มเติม


ฉันคิดว่ารหัสของคุณมองหาการอัปเกรดไม่ใช่อัปเดต ตัวอย่างเช่นฉันเพิ่งรัน "apt-get update" (หัวข้อของคำถามนี้) บน Ubuntu 16.04 ของฉันและไม่มีการเปลี่ยนแปลงเพียงเล็กน้อยใน / var / log / apt หมายความว่าการสแกนทุกอย่างในไดเรกทอรีนั้นจะไม่มีประโยชน์ ตอบคำถามนี้โดยเฉพาะ
Ron Burk

1
คุณพูดถูก ขอบคุณสำหรับการชี้ให้เห็นว่า ฉันเปลี่ยนคำตอบเพื่อให้สะท้อนถึงสิ่งนั้นแล้ว เรากำลังมองหาการอัพเดทล่าสุดที่มีการนำไปใช้กับเครื่องมากกว่าการอัพเดทที่เพิ่งถูกดาวน์โหลด
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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.