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
(我也猜dpkg
)confmodule
如果它们与文件(config
、postinst
和prerm
)上的“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)。