如何解决使用示例初始化脚本
HSQLDB 文档包含 instructions,用于在 Unix 上将 HSQLDB 作为守护程序运行,并带有示例 init script。但是,这假设了 System V 设置,而我的目标是基于 systemd 的设置。
HSQLDB 的一个挑战是关闭过程很棘手——它涉及连接到数据库并发出关闭命令,因此即使使用 systemd,您也几乎需要一个脚本。
虽然 systemd 为 SysV init 脚本提供了兼容性功能,它会自动围绕每个 init 脚本创建一个 systemd 包装器,但我尝试实现一个原生的 systemd 服务,尽可能依赖于 init 脚本(因为,正如之前建立的那样,复杂的关机逻辑需要脚本)。
我的方法是将 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
)是否可行?有什么理由反对这样做吗?在这种情况下,我还有什么其他选择?
解决方法
这需要一些修改:
- 在
.service
文件中,删除User=
设置:这将导致 systemd 以 root 身份运行 init 脚本。 - 在同一个文件中,删除
WorkingDirectory=
,因为它只会控制 init 脚本运行的目录(可以从任何地方运行)。 - init 脚本从 DB 服务帐户的主目录运行,因此这将是许多文件(例如
server.properties
和从那里引用的任何文件)的默认路径——确保它们在正确的地方。 - Systemd 期望服务进程由启动它的帐户(在本例中为 root)拥有,或者 PID 文件由 root 拥有。默认情况下,HSQLDB init 脚本不会这样做——确保在调用
chown root $PIDFILE
之前插入exit 0
(在我的例子中是第 455 行)。
通过这些更改,HSQLDB 可以干净地启动和停止。唯一的问题是我收到来自 systemd 的警告,内容为:
Supervising process 1541 which is not our child. We'll most likely not notice when it exits.
这可能意味着 systemd 不会注意到服务是否崩溃或以其他方式退出而没有被 systemd 停止。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。