【问题标题】:Run HSQLDB as a systemd service using the sample init script使用示例 init 脚本将 HSQLDB 作为 systemd 服务运行
【发布时间】:2021-06-21 16:04:30
【问题描述】:

HSQLDB 文档有 instructions 用于在 Unix 上将 HSQLDB 作为守护程序运行,并带有示例 init script。但是,这假设是 System V 设置,而我的目标是基于 systemd 的设置。

HSQLDB 的一个挑战是关闭过程很棘手——它涉及连接到数据库并发出关闭命令,因此即使使用 systemd 也几乎需要一个脚本。

虽然 systemd 带有 SysV init 脚本的兼容性功能,它会自动为每个 init 脚本创建一个 systemd 包装器,但我尝试实现一个本机 systemd 服务,尽可能依赖 init 脚本(因为,如前所述,复杂的关机逻辑需要脚本)。

我的方法是将初始化脚本放在 /usr/sbin 中,并围绕它创建以下 systemd 服务包装器:

[Unit]
Description=HSQLDB Server
After=network.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/hsqldb.pid
User=hsqldb
WorkingDirectory=~
ExecStart=/usr/sbin/hsqldb start
ExecStop=/usr/sbin/hsqldb stopcompact

[Install]
WantedBy=multi-user.target

但是,这失败了,因为 init 脚本期望在不同的地方是 root。脚本本身有一个检查,当以对文件系统的根目录没有写入权限的用户身份运行时,它会导致它失败——这是一个可以从脚本中删除的检查,但随后会在其中创建 pid 文件/run 失败。

除了依赖兼容性功能之外,还有什么简单的方法可以让这项工作发挥作用?让 systemd 以 root 身份运行脚本(通过在服务文件中设置 User)会起作用吗?有什么反对这样做的理由吗?在这种情况下,我还有什么其他选择?

【问题讨论】:

    标签: hsqldb systemd init


    【解决方案1】:

    这适用于一些修改:

    • .service 文件中,删除User= 设置:这将导致systemd 以root 身份运行init 脚本。
    • 在同一个文件中,删除 WorkingDirectory=,因为它只会控制 init 脚本运行的目录(可以从任何地方运行)。
    • init 脚本从 DB 服务帐户的主目录运行,因此这将是许多文件的默认路径(例如 server.properties 和从那里引用的任何文件)——确保它们位于正确的位置.
    • Systemd 期望服务进程归启动它的帐户(在本例中为 root)或 PID 文件归 root 所有。默认情况下,HSQLDB 初始化脚本不会执行此操作 - 请务必在调用 exit 0 之前插入 chown root $PIDFILE(在我的例子中是第 455 行)。

    通过这些更改,HSQLDB 可以干净利落地启动和停止。唯一的问题是我收到来自 systemd 的警告:

    Supervising process 1541 which is not our child. We'll most likely not notice when it exits.
    

    这可能意味着如果服务在没有被 systemd 停止的情况下崩溃或以其他方式退出,systemd 将不会注意到。

    【讨论】:

      猜你喜欢
      • 2017-08-01
      • 1970-01-01
      • 2015-10-09
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 2019-01-20
      • 1970-01-01
      相关资源
      最近更新 更多