【发布时间】: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)会起作用吗?有什么反对这样做的理由吗?在这种情况下,我还有什么其他选择?
【问题讨论】: