如何检测 Ubuntu 下安装、删除或更新软件包的时间?

How do I detect when a package gets installed, removed, or updated under Ubuntu?

我正在寻找一种方法来了解 Ubuntu 系统上安装的软件包列表在我的 C++ 应用程序 运行ning 时发生了变化。

我有一个守护进程,它可以在系统发生某些变化时通知其他应用程序,其中之一是已安装软件包的列表。我想跟踪一定数量的包,例如 Apache2、Cassandra、NTP、Postfix...以便能够分辨集群中每台计算机上什么是 运行ning 什么不是 运行ning .这应该是连续的,以便状态保持最新(至少在一两分钟内)。但是,使用 dpkg -l ntp 之类的内容读取已安装软件包的列表非常长并且需要相当多的处理时间,所以我想 运行 只有在对安装进行更改时才执行该命令(这应该是一个相对罕见的事件,假设我们每天最多进行一次安全更新,我不必 运行 dpkg -l ... 一天不止一次,除非管理员 adds/removes 白天有项目,我需要足够快地检测到那些变化。)

如果你使用apt-getapt,看的地方是apt的历史记录,精确查看文件

/var/log/apt/history.log*

另一方面,dpkg 跟踪所有 installed/removed 包,在文件中:

/var/log/dpkg.log*

来自我系统的片段:

Start-Date: 2015-08-04  19:55:15
Commandline: apt-get install youtube-dl
Install: libavresample1:amd64 (9.11-2ubuntu2, automatic), libavfilter3:amd64 (9.11-2ubuntu2, automatic), libquvi7:amd64 (0.4.1-1ubuntu3, automatic), libbs2b0:amd64 (3.1.0+dfsg-2ubuntu2, automatic), libav-tools:amd64 (9.11-2ubuntu2, automatic), libquvi-scripts:amd64 (0.4.21-1, automatic), youtube-dl:amd64 (2014.02.17-1), libmpg123-0:amd64 (1.16.0-1ubuntu1, automatic), libavdevice53:amd64 (9.11-2ubuntu2, automatic), mplayer2:amd64 (2.0-701-gd4c5b7f-2ubuntu2, automatic), libvdpau1:amd64 (0.7-1, automatic), rtmpdump:amd64 (2.4+20121230.gitdf6c518-1, automatic)
End-Date: 2015-08-04  19:55:36

Start-Date: 2015-08-18  14:41:02
Commandline: apt-get install sshpass
Install: sshpass:amd64 (1.05-1)
End-Date: 2015-08-18  14:41:03

您可以通过 --pre-invoke--post-invoke 挂钩选项添加脚本来跟踪更改。在获得 dpkg 锁之前和之后应该 运行,因此从那里对 运行 dpkg-query 命令应该是安全的。

有关详细信息,请查看 dpkg 手册页。