АПП опирается на фкнтл(2) блокировка; поскольку ubuntu не предоставляет команду блокировки fcntl, вы можете использовать fcntl-блокировка утилита для блокировки (клон команды flock Питера Анвина, правда, немного устаревший).
#!/бин/баш
apt_cache=/var/cache/apt/архивы
# Ссылка: https://github.com/magnumripper/fcntl-lock
# fcntl-lock является клоном fcntl() функции flock(1) Х. Питера Анвина.
coproc БЛОКИРОВКА {
exec fcntl-блокировка \
-x -w 3600 "$apt_cache/lock" -c 'echo true; исполнительный кот
}
читать -ru ${LOCK[0]} || { \
echo Не удалось получить блокировку.
выход 1
}
объявить -а а=()
объявить -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} ${Пакет}_${Версия}_${Архитектура}.deb\n' \
)
для f в "${!A[@]}"; делать
[[ ${B[$f]} = 1 ]] || \
а+=("$apt_cache/${А[$f]}")
сделано
((${#a[@]} > 0)) && \
printf %s\0 "${a[@]}" | xargs -0 rm -v || выход 0
# эхо Успех | ts >> /var/log/apt-archive-clean.log
Если вы хотите автоматизировать, я думаю, используя systemd.path работает лучше всего.
apt-архив-clean.path
[Ед. изм]
Description=Очистка архива APT
[Дорожка]
PathChanged=/var/cache/apt/archives/lock
[Установить]
WantedBy=многопользовательская.цель
apt-архив-clean.service
[Ед. изм]
Description=Очистка архива APT
[Оказание услуг]
Тип=простой
ExecStart=/opt/bin/apt-archive-clean.sh