我还拼凑了一些命令。主要是使用
awk
来解析
apt
的输出,但如果有人熟悉更本地的命令就太好了。
如果你想找出所有正在进行分阶段更新以及它们关联的阶段百分比的软件包。
apt-cache dumpavail | awk '/^Package: /{p=$2} /^Phased-Update-Percentage/{print p,$2}'
然而,根据你的问题,你可能只关心正在进行分阶段更新的
已安装软件包。
apt-cache dumpavail | awk '/^Package: /{p=$2} /^Phased-Update-Percentage/{cmd="dpkg -l "p" 2>&1 | grep -c ^ii";cmd | getline out;close(cmd); if(out > 0){print p,$2}}'
你还可以找到将被保留的软件包。在这种情况下,是在进行完全升级时。
apt-get --simulate full-upgrade | awk '/^The following packages have been kept back:/{save=1;next} /^[[:graph:]]/{save=0;next} save{kp=kp$0} END{split(kp,kpa);for(kpi in kpa){print kpa[kpi]}}'
但是你想要“立即告诉哪些待处理的软件包将被安装,哪些由于分阶段更新而被推迟”。把它们整合在一起。
apt-cache dumpavail |
awk -v OFS="," -v kp="$(
apt-get --simulate full-upgrade | awk '/^The following packages have been kept back:/{save=1;next} /^[[:graph:]]/{save=0;next} save{kp=kp$0} END{print kp}'
)" \
'BEGIN{split(kp,kpa);for(kpi in kpa){kpd[kpa[kpi]]=""}} /^Package: /{p=$2} /^Phased-Update-Percentage/{cmd="dpkg -l "p" 2>&1 | grep -c ^ii";cmd | getline out;close(cmd); if(out > 0){if(p in kpd){print p,"phased "$2,"held back"}else{print p,"phased "$2,"not held back"}}}'
这是在最近打了补丁的22.04服务器上的样本输出(管道传输到
column
)。
root@ubuntu:~# apt-cache dumpavail | awk -v OFS="," -v kp="$(apt-get --simulate full-upgrade | awk '/^The following packages have been kept back:/{save=1;next} /^[[:graph:]]/{save=0;next} save{kp=kp$0} END{print kp}')" 'BEGIN{split(kp,kpa);for(kpi in kpa){kpd[kpa[kpi]]=""}} /^Package: /{p=$2} /^Phased-Update-Percentage/{cmd="dpkg -l "p" 2>&1 | grep -c ^ii";cmd | getline out;close(cmd); if(out > 0){if(p in kpd){print p,"phased "$2,"held back"}else{print p,"phased "$2,"not held back"}}}' | column -t -s ,
grub-efi-amd64-bin phased 0 held back
grub-efi-amd64-signed phased 0 held back
libmbim-glib4 phased 70 held back
libmbim-proxy phased 70 held back
libmm-glib0 phased 70 not held back
libqmi-glib5 phased 70 held back
libqmi-proxy phased 70 held back
libsasl2-2 phased 70 held back
libsasl2-modules phased 70 held back
libsasl2-modules-db phased 70 held back
modemmanager phased 70 held back
python3-software-properties phased 0 held back
shim-signed phased 62 held back
software-properties-common phased 0 held back
tcpdump phased 20 not held back
ubuntu-advantage-tools phased 20 held back
结果与
full-upgrade
输出相匹配
root@ubuntu:~# apt-get --simulate full-upgrade
...
The following packages have been kept back:
grub-efi-amd64-bin grub-efi-amd64-signed libmbim-glib4 libmbim-proxy libqmi-glib5 libqmi-proxy libsasl2-2 libsasl2-modules libsasl2-modules-db modemmanager python3-software-properties shim-signed software-properties-common ubuntu-advantage-tools
The following packages will be upgraded:
isc-dhcp-client isc-dhcp-common libmm-glib0 tcpdump
注意事项
- 我在Ubuntu 22.04上使用apt
2.4.8
测试了这些命令。
- 这些命令可能无法处理某些情况。
- 这不是一个快速解决方案,在我的最低规格虚拟机上运行需要超过10秒的时间。
- 处理分阶段更新的方式似乎正在发生变化。在深入研究之前,我使用
apt-cache policy
来确定一个软件包是否被拦截。然而,这种方法不再可靠。我找到了一个apt配置选项APT::Get::Phase-Policy=True
,它有所帮助,但结果与实际的apt行为不一致。以下是我根据apt-cache policy
输出解析而得到的结果,但与apt的实际行为不匹配。
root@ubuntu:~# for i in $(apt-cache dumpavail | awk '/^Package: /{p=$2} /^Phased-Update-Percentage/{cmd="dpkg -l "p" 2>&1 | grep -c ^ii";cmd | getline out;close(cmd); if(out > 0){print p}}'); do apt-cache -o=APT::Get::Phase-Policy=True policy $i | awk -v p=$i 'NR==2{iv=$2} NR==3{cv=$2} /phased/{pv=$1;pp=$3" "$4;exit} END{if( cv == pv ) { printf "%s,%s,not held back\n",p,pp }else{printf "%s,%s,held back\n",p,pp}}'; done | column -t -s ,
grub-efi-amd64-bin (phased 0%) held back
grub-efi-amd64-signed (phased 0%) held back
libmbim-glib4 (phased 70%) held back
libmbim-proxy (phased 70%) held back
libmm-glib0 (phased 70%) not held back
libqmi-glib5 (phased 70%) not held back
libqmi-proxy (phased 70%) not held back
libsasl2-2 (phased 70%) held back
libsasl2-modules (phased 70%) held back
libsasl2-modules-db (phased 70%) held back
modemmanager (phased 70%) not held back
python3-software-properties (phased 0%) held back
shim-signed (phased 62%) held back
software-properties-common (phased 0%) held back
tcpdump (phased 20%) not held back
ubuntu-advantage-tools (phased 20%) held back
awk
,所以不知道该如何修复这个问题! - Paddy Landau