![设置 postinst 来运行 SQL 文件](https://linux22.com/image/208785/%E8%AE%BE%E7%BD%AE%20postinst%20%E6%9D%A5%E8%BF%90%E8%A1%8C%20SQL%20%E6%96%87%E4%BB%B6.png)
我试图完成的是在安装我的 Debian 软件包之前执行我的 postinst 文件。尝试启动 SQL 导入来创建数据库和表,我的 DEBIAN 文件夹中的 preinst 中有以下内容
#!/bin/bash
DB_USER="#"
DB_PASSWORD="#"
DB_NAME="#"
MAINDB="#"
mysql -e "CREATE DATABASE ${MAINDB} /*\!40100 DEFAULT CHARACTER SET utf8 */;"
mysql -h localhost -u $DB_USER -p$DB_PASSWORD $DB_NAME < sqlfile.sql
但它没有找到要导入的 sqlfile.sql,知道我将 sql 文件放在哪里它从来没有看到它,我应该把这个文件放在哪里。 ?或者有更好的方法来实现这一点。
谢谢你的帮助
答案1
这里有几个问题:
mysql ... < sqlfile.sql
您应该使用 的绝对路径sqlfile.sql
。目前这是相对路径。您认为 的工作目录postinst
在哪里?我认为它在 中运行/
,但我从未依赖过它。
第二,从哪里来sqlfile.sql
? preinst
在解包您的包之前调用 [1]。如果sqlfile.sql
它在你的包中,那么它还没有被解压到文件系统中。在这种情况下,请将您的逻辑移至postinst
.您可能需要确保该代码行出现在postinst
需要尽早运行的内容之前。
如果sqlfile.sql
位于依赖包中,请务必Pre-Depends:
在该包上使用。这是确保sqlfile.sql
在调用之前已部署的唯一方法preinst
(尽管 Pre-Depends: 包可能仅处于“未打包”或“半配置”状态。
如果sqlfile.sql
是临时文件,则将其安装到/usr/lib/mypkg/sqlfile.sql
您的postinst
:
mysql ... < /usr/lib/mypkg/sqlfile.sql
最后,您的维护者脚本在安装过程中可能会被多次调用。这不是您的问题,但最好仅在特定调用期间触发特定代码。这是您可以使用的一些模板代码。将您想要运行的任何代码放入适当的 case 语句中:
#!/bin/sh
# preinst template
set -e
case "$1" in
install|upgrade)
;;
abort-upgrade)
;;
*)
echo "preinst called with unknown argument \`$1'" >&2
exit 1
;;
esac
#DEBHELPER#
exit 0
#!/bin/sh
# postinst
set -e
case "$1" in
configure)
;;
abort-upgrade|abort-remove|abort-deconfigure)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 1
;;
esac
#DEBHELPER#
exit 0