![postinst 总是因为 debconf 而失败](https://linux22.com/image/1125623/postinst%20%E6%80%BB%E6%98%AF%E5%9B%A0%E4%B8%BA%20debconf%20%E8%80%8C%E5%A4%B1%E8%B4%A5.png)
我在使用 debconf 处理我的软件包时遇到了一些麻烦。我在 package.config 文件中请求 mysql pw:
. /usr/share/debconf/confmodule
db_input high mypkg/mysql_root_pw
db_go
然后,在 postinst 中,我向 debconf 询问密码并将其写入配置文件:
. /usr/share/debconf/confmodule
db_get mypkg/mysql_root_pw
# write pw to config file
当我这样做时,这有效dpkg-reconfigure --force mypkg
。但是,当使用时apt-get -f install
(我必须这样做,因为它说我的 pkg 已损坏),它总是失败:
Setting up mypkg (1.5.4-3) ...
debconf (developer): frontend started
debconf (developer): frontend running, package name is mypkg
debconf (developer): starting /var/lib/dpkg/info/mypkg.config configure
debconf (developer): <-- INPUT low mypkg/mysql_root_pw
debconf (developer): --> 30 question skipped
dpkg: error processing mypkg (--configure):
subprocess installed post-installation script returned error exit status 30
Errors were encountered while processing:
mypkg
我编辑了脚本/var/lib/dpkg/info/mypkg.postinst
,错误发生在我获取 debconf 库的行上:
. /usr/share/debconf/confmodule
这可能是因为 debconf 已经具有原始安装中的值,因此不会再次显示该问题。但如果我已经拥有它,我该如何跳过询问,为什么它在那一行失败而不是当我这样做时失败db_get
?
我已经在谷歌上搜索过但似乎找不到太多关于此的有用信息。
答案1
所以我终于让它工作了。如果 debconf 已经有了值,那么当我在 postinst 中获取第一个问题时,debconf 总是会失败。我终于有了一个(显而易见的)想法,即检查系统上其他软件包的 postinst 和配置文件,这就是诀窍:
在你的配置中
. /usr/share/debconf/confmodule
db_input high mypkg/mysql_root_pw || true
db_go || true
就是这样。当我请求 postinst 中的值时,debconf 很顺利。显然,您需要处理未获取任何值的情况。
另外,我db_stop
在我的帖子中添加了一个,我不知道是否有必要,但为了完整起见,我会添加它。
上传时间:2018-03-23
. /usr/share/debconf/confmodule
db_get mypkg/mysql_root_pw
mysql_root_pw=$RET
db_get mypkg/some_other_value
some_other_value=$RET
db_stop
# do something with the $mysql_root_pw and $some_other_value vars
希望有一天这能帮助到别人。
干杯