与仅使用 systemd 相比,我从 JSVC 获得什么好处?

2022-09-01 10:58:38

Tomcat 文档描述了编译和安装 JSVC 的过程,JSVC 可用于将 Tomcat 作为守护程序运行。根据我的理解,JSVC有两个好处:

  1. 它以 root 身份启动,允许使用特权端口(如 80 或 443)。
  2. 它创建一个“控制器进程”,该进程将监视“受控进程”(主Java线程)并在失败时重新启动该进程。

我一直在学习系统化,包括服务单元配置。基于我有限的理解,如果我设置(使用所需的用户名)并在我的配置文件中设置,systemd能够执行与JSVC相同的任务。User=tomcatRestart=on-failuretomcat.service

使用JSVC,我希望看起来像这样:tomcat.service

[Unit]
Description=Apache Tomcat
After=network.target

[Service]
Environment=CATALINA_PID=/var/run/tomcat.pid
Environment=JAVA_HOME=/path/to/java
Environment=CATALINA_HOME=/opt/tomcat
...

ExecStart=/opt/tomcat/bin/jsvc \
    -Dcatalina.home=${CATALINA_HOME} \
    -user tomcat \
    -java-home ${JAVA_HOME} \
    -pidfile ${CATALINA_PID} \
    ...
    org.apache.catalina.startup.Bootstrap

ExecStop=/opt/tomcat/bin/jsvc \
    -pidfile ${CATALINA_PID} \
    ...
    -stop \
    org.apache.catalina.startup.Bootstrap

[Install]
WantedBy=multi-user.target

使用systemd,我希望看起来像这样:tomcat.service

[Unit]
Description=Apache Tomcat
After=network.target

[Service]
Type=forking  
PIDFile=/var/run/tomcat.pid
User=tomcat
Group=tomcat
Environment=JAVA_HOME=/path/to/java
Environment=CATALINA_HOME=/opt/tomcat
...

Restart=on-failure

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

[Install]
WantedBy=multi-user.target

我的偏好是只使用systemd,因为它已经存在,无论如何我都必须(应该)使用它。然而,我不确定我是否会错过使用JSVC的任何好处,而我忽略了这一点。

如果我想将 Tomcat 作为守护进程运行,JSVC 可以实现哪些是 systemd 无法实现的?

另外,如果 systemd 能够执行与 JSVC 和 JSVC 相同的任务,我还想询问您可能提供的任何配置技巧,以便仅使用 systemd 最好地实现 JSVC 的好处。


答案 1

通常,jsvc 提供的大部分功能都是由 systemd 提供的,但打开特权端口除外(见下文)。如果可能的话,切换到直接使用systemd功能是一个非常好的主意,因为事情变得更简单,更高效。

您的单位文件看起来基本正常,除了

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

此部分看起来像另一个包装器,可以直接替换为 .java -jar ...

打开特权套接字

在 Systemd 下,这通常是通过套接字激活来完成的。Systemd 打开套接字并将其作为打开的文件描述符(如 stdin、stdout、stderr)传递给守护程序。

然后,该守护程序可以作为非特权用户启动,并且不会删除特权本身。守护程序必须支持这一点,而不是自己打开套接字,它应该使用给定的套接字。在Java下,由于Java stdlib中缺乏支持,这变得非常成问题。

AFAIK,tomcat 不支持套接字激活,因此,如果要使用特权端口并在非特权用户下运行守护程序,则可能仍然需要 jsvc。


答案 2

在这一点上,我会使用JSvc。但是,如果有必要,请使用Systemd脚本包装它。

  1. 请记住,JSvc只是另一个可执行文件。例如,常规系统用户可以配置 JSvc 服务。可以肯定地说,在大多数发行版上,Systemd需要配置root权限。

  2. 我还编写了使用JSvc和ProcRun的Java程序.exe包装一个小的Java接口。这允许我在Unix和Windows操作系统上使用相同的服务代码甚至JUnit集成测试。因此,我认为JSvc和ProcRun.exe共同促进跨平台服务代码。

  3. JSvc有一些有趣的Java特定选项,可能对您有用。如如何启动JVM(进程或DLL)等。你可以把很多这些写进一个Systemd脚本中,但我怀疑你只是在Bash中重写JSvc。

因此,对于您特定的Tomcat示例来说,它可能不是很有吸引力。但是,与 Systemd 相比,使用微小的 JSvc 服务包装器有一些优点。


推荐