![执行预安装和配置脚本的顺序](https://linux22.com/image/987875/%E6%89%A7%E8%A1%8C%E9%A2%84%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE%E8%84%9A%E6%9C%AC%E7%9A%84%E9%A1%BA%E5%BA%8F.png)
是否可以强制某个预安装脚本在另一个脚本之前运行?
我想要做的是在我的私人存储库中创建一个包,它在安装时会首先询问一些问题,然后才会解压其他包(它所依赖的包)。
例如,假设我想创建my-mysql
依赖于mysql-server-5.5
标准存储库的包。我希望在用户键入apt-get install my-mysql
formy-mysql.preinst
之前运行mysql-server-5.5.preinst
(这样它就可以debconf-set-selections
自动生成 root 密码并阻止 mysql-server 包以交互方式询问)。
我可以不将任何依赖项放在my-mysql
包中,并手动运行两个命令来完成此操作:
apt-get install my-mysql
apt-get install mysql-server-5.5
但我需要它只使用一个命令 ( apt-get install my-mysql
)。我尝试使用Pre-depends
第三个包(可执行配置)和Depends
mysql-server-5.5,但它似乎mysql-server-5.5.preinst
总是先运行。有没有办法改变这种情况并强制我的包 preinst 在它之前运行?
作为替代方法,apt-get install mysql-server-5.5
由于 dpkg 锁定问题,我也无法从 postinst 运行,并且希望以比锁定像这样的临时解决方案。
更新:正如评论中提到的,似乎 mysql-server 包中也有.config
脚本(带有关联.templates
),它们甚至在脚本之前执行.preinst
,所以我也需要对它们进行排序。
答案1
我已经找到办法了。
因此,为了让单一apt-get install my-mysql
工作如所述,我必须做几件事:
- 制作
my-mysql
软件包,使其预先依赖my-mysql-config
并依赖于mysql-server
创建附加包
my-mysql-config
,该包预先依赖debconf
并包含my-mysql-config.templates
脚本my-mysql-config.config
(其中包括设置密码,以便 mysql-server-5.5 不会要求输入密码),其中包含如下代码:. /usr/share/debconf/confmodule db_set mysql-server/root_password "$PW" db_fset mysql-server/root_password seen true db_set mysql-server/root_password_again "$PW" db_fset mysql-server/root_password_again seen true
还包含执行并创建配置文件
my-mysql-config.preinst
的代码db_get
前mysql-server 启动- 在安装并运行 mysql-server 后,您可以使用
my-mysql
包脚本来运行您想要的东西。.postinst
Debconf 程序员教程在那里有很大的帮助,就像使用export DEBCONF_DEBUG=developer
和set -x
在脚本中进行调试一样。
另外两个耗时的调试问题是确保 config/preinst/postinst 脚本不会向 STDOUT 输出任何内容(因为它会以奇怪而有趣的方式破坏 debconf),以及db_stop
如果你做类似的事情invoke-rc.d mysql restart
(否则你的 apt-get 会卡住,甚至不会响应Ctrl+ C)