APT พึ่งพา เอฟซีเอ็นทีแอล(2) ล็อค; เนื่องจากอูบุนตูไม่มีคำสั่งล็อก fcntl คุณจึงอาจใช้ fcntl-ล็อค ยูทิลิตี้สำหรับการล็อค (แม้ว่าจะเป็นโคลนของคำสั่งฝูงของ Peter Anvin ซึ่งล้าสมัยเล็กน้อย)
#!/bin/bash
apt_cache=/var/cache/apt/archives
# ลิงค์: https://github.com/magnumripper/fcntl-lock
# fcntl-lock เป็น fcntl() โคลนฝูงของ H. Peter Anvin(1)
coproc ล็อค {
ผู้บริหาร fcntl-ล็อค \
-x -w 3600 "$apt_cache/lock" -c 'echo จริง; ผู้บริหารแมว'
}
อ่าน -ru ${LOCK[0]} || { \
echo ล้มเหลวในการรับล็อค
ทางออก 1
}
ประกาศ -a =()
ประกาศ -A A=() B=()
# URL ถอดรหัสชื่อไฟล์ .deb
ซีดี "$apt_cache"
สำหรับ b ใน *.deb; ทำ
printf -v c %b "${b//%/\x}"; ก[$ค]=$ข
เสร็จแล้ว
# คุณสามารถใช้ @(rc|ii) เพื่อเพิ่มตัวย่อเพิ่มเติม
ในขณะที่อ่าน -r d e; ทำ
[[ $d = ii ]] && B[$e]=1
เสร็จแล้ว < <( \
dpkg-แบบสอบถาม \
-Wf='${db:Status-Abbrev} ${Package}_${Version}_${Architecture}.deb\n' \
)
สำหรับ f ใน "${!A[@]}"; ทำ
[[ ${B[$f]} = 1 ]] || \
a+=("$apt_cache/${A[$f]}")
เสร็จแล้ว
((${#a[@]} > 0)) && \
printf %s\0 "${a[@]}" | xargs -0 rm -v || ทางออก 0
# สะท้อนความสำเร็จ | ts >> /var/log/apt-archive-clean.log
หากคุณต้องการทำให้เป็นอัตโนมัติฉันคิดว่าใช้ systemd.path ทำงานได้ดีที่สุด
apt-archive-clean.path
[หน่วย]
คำอธิบาย=การล้างข้อมูลที่เก็บถาวร APT
[เส้นทาง]
PathChanged=/var/cache/apt/archives/lock
[ติดตั้ง]
WantedBy=multi-user.target
apt-archive-clean.service
[หน่วย]
Description=การล้างไฟล์เอกสาร APT
[บริการ]
ประเภท = ง่าย
ExecStart=/opt/bin/apt-archive-clean.sh