systemd 系统中出现 Debconf 错误

systemd 系统中出现 Debconf 错误

debconf我在安装过程中在Ubuntu 16.04中使用配置包时遇到了以下问题。

更准确地说,该包用于debconf保存配置文件,然后在postinst脚本中启动服务。该服务还使用一个debconf模块来加载上一步中保存的配置。

但是,服务启动systemd失败并出现错误:

debconf: DbDriver "config": /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable

据我所知,dpkg仍在使用debconf前端访问此文件,并且当服务尝试启动另一个前端时崩溃(环境变量DEBIAN_HAS_FRONTEND未传递给服务)。我尝试DEBIAN_HAS_FRONTEND在脚本中强制使用 env 变量,但随后出现其他错误。

dpkg我想我应该在进程结束后强制启动守护进程,并且debconf已经完成,有什么想法吗?

答案1

所以,我终于找到了这个问题,我会把它发布出来,以防将来对某人有帮助。

正如我所说,我试图从postinst脚本启动一个服务,并说服务试图用来debconfig获取一些配置参数,但是出现错误,debconf因为已经有一个实例正在运行(尽管所有配置都是在config文件,而不是在postinst) 中。

当时的问题是,在脚本debconf执行期间有一个活动的前端postinst,而我没有使用debconf.然而,我评论了加载的行confmodue

# . /usr/share/debconf/confmodule

显然,dpkg-reconfigure(我也猜dpkgconfmodule如果它们与文件(configpostinstprerm)上的“confmodule”字符串匹配,则考虑加载。因此,虽然我没有有效地加载 confmodule,但 dpkg-reconfigure 没有释放前端,这就是该服务无法启动另一个debconf实例的原因。解决方案是简单地删除该行。

答案2

首先,在独立程序中使用 debconf 感觉不对。引用man debconf-devel其他脚本部分:

您还可以在其他独立程序中使用 debconf。这里需要注意的问题是 debconf 无意也不能用作注册表。毕竟这是unix,程序是由/etc中的文件配置的,而不是由一些模糊的debconf数据库(无论如何,这只是一个缓存,可能会被吹走)配置。因此,在独立程序中使用 debconf 之前请仔细考虑。

相同的手册页还可以帮助解决上一节(THE POSTINST SCRIPT)中的实际问题:

如果你的 postinst 启动了一个守护进程,请确保你告诉 debconf 最后停止,因为 debconf 可能会对你的 postinst 何时完成感到有点困惑。

也就是说,db_stop在启动守护进程之前发出问题(即使它本身不使用 debconf)。

相关内容