如何检测在Ubuntu下安装、删除或更新软件包? 我想知道一种方法,知道在我的C++应用程序运行时,安装在Ubuntu系统上的软件包列表发生了变化。

如何检测在Ubuntu下安装、删除或更新软件包? 我想知道一种方法,知道在我的C++应用程序运行时,安装在Ubuntu系统上的软件包列表发生了变化。,ubuntu,daemon,dpkg,Ubuntu,Daemon,Dpkg,我有一个守护进程,当系统上的某些事情发生变化时,它会告诉其他应用程序,其中之一是已安装软件包的列表。我想跟踪一定数量的软件包,如Apache2、Cassandra、NTP、Postfix。。。能够辨别集群中每台计算机上正在运行和未运行的内容。这应该是连续的,以便状态保持最新(至少在一两分钟内)。但是,使用dpkg-l ntp等内容读取已安装软件包的列表非常长,并且需要相当多的处理时间,因此我只希望在对安装进行更改时运行该命令(这应该是一个相对罕见的事件,假设我们每天最多有一次安全更新,我不必每天

我有一个守护进程,当系统上的某些事情发生变化时,它会告诉其他应用程序,其中之一是已安装软件包的列表。我想跟踪一定数量的软件包,如Apache2、Cassandra、NTP、Postfix。。。能够辨别集群中每台计算机上正在运行和未运行的内容。这应该是连续的,以便状态保持最新(至少在一两分钟内)。但是,使用
dpkg-l ntp
等内容读取已安装软件包的列表非常长,并且需要相当多的处理时间,因此我只希望在对安装进行更改时运行该命令(这应该是一个相对罕见的事件,假设我们每天最多有一次安全更新,我不必每天运行一次以上的
dpkg-l…
,除非管理员在白天添加/删除项目,否则我需要足够快地检测到这些更改。)

如果使用
apt get
apt
,可以查看
apt
的历史日志,精确检查文件

/var/log/apt/history.log*
另一方面,
dpkg
在以下文件中跟踪所有已安装/已删除的软件包:

/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
手册页以了解更多详细信息。

无论我以何种方式安装软件包,这都有效吗?(即aptitude还是直接dpkg?)@AlexisWilke只是
apt
的日志apt在引擎盖下运行
dpkg
,所以监控
dpkg
日志应该足够了。在命令行上,它不起作用,因为运行
dpkg
的人必须积极主动,并确保添加我的挂钩…这不太可能发生。但这让我觉得他们有办法解决问题nstall hooks位于
/etc/dpkg/dpkg.cfg.d/
下。这就是实现它的方法!对了,很抱歉,我认为从回答中可以明显看出这一点,但我想不是,因为--form中的选项可能比其他选项更容易混淆。