设置 postinst 来运行 SQL 文件

设置 postinst 来运行 SQL 文件

我试图完成的是在安装我的 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.sqlpreinst在解包您的包之前调用 [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

[1]https://www.debian.org/doc/debian-policy/ch-maintainerscripts.html#summary-of-ways-maintainer-scripts-are- Called

相关内容