APT se bazează pe fcntl(2) blocare; deoarece ubuntu nu oferă o comandă fcntl lock, puteți utiliza fcntl-lock utilitar pentru blocare (o clonă a comenzii de turmă a lui Peter Anvin, ușor depășită, totuși).
#!/bin/bash
apt_cache=/var/cache/apt/archives
# Link: https://github.com/magnumripper/fcntl-lock
# fcntl-lock este o clonă fcntl() a turmei lui H. Peter Anvin(1)
coproc LOCK {
exec fcntl-lock \
-x -w 3600 "$apt_cache/lock" -c 'echo true; pisica executiva
}
citește -ru ${LOCK[0]} || { \
echo Nu s-a putut obține o blocare.
iesirea 1
}
declara -a a=()
declara -A A=() B=()
# URL decodează numele fișierelor .deb.
cd „$apt_cache”
pentru b în *.deb; do
printf -v c %b „${b//%/\x}”; A[$c]=$b
Terminat
# Puteți folosi @(rc|ii) pentru a adăuga mai multe abrev
în timp ce se citește -r d e; do
[[ $d = ii ]] && B[$e]=1
gata < <( \
dpkg-query \
-Wf='${db:Status-Abbrev} ${Package}_${Version}_${Arhitecture}.deb\n' \
)
pentru f în „${!A[@]}”; do
[[ ${B[$f]} = 1 ]] || \
a+=("$apt_cache/${A[$f]}")
Terminat
((${#a[@]} > 0)) && \
printf %s\0 „${a[@]}” | xargs -0 rm -v || iesirea 0
# echo Succes | ts >> /var/log/apt-archive-clean.log
Dacă vrei să automatizezi, cred că folosești systemd.path funcționează cel mai bine.
apt-archive-clean.path
[Unitate]
Descriere=Curățare arhivă APT
[Cale]
PathChanged=/var/cache/apt/archives/lock
[Instalare]
WantedBy=multi-user.target
apt-archive-clean.service
[Unitate]
Descriere=Curăţare arhivă APT
[Serviciu]
Tip=simplu
ExecStart=/opt/bin/apt-archive-clean.sh