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

What benefit do I get from JSVC over just using systemd?

Tomcat 文档 describes the process of compiling and installing JSVC 可用于 运行 Tomcat 作为守护进程。据我了解,JSVC 有两个好处:

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

我一直在学习systemd, including the service unit configuration。根据我有限的理解,如果我在 tomcat.service 配置文件中设置 User=tomcat(使用所需的用户名)和 Restart=on-failure,systemd 能够执行与 JSVC 相同的任务。

使用 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作为daemon有什么是JSVC可以实现而systemd不能实现的?

此外,如果 systemd 能够执行与 JSVC 和 JSVC 相同的任务,我还想询问您可能提供的任何配置提示,以最好地实现 JSVC 的优势,使用只是 systemd.

一般来说,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 可能仍然是必要的。

此时,我会使用 JSvc。但如果必须的话,用 Systemd 脚本包装它。

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

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

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

因此,对于您的特定 Tomcat 示例,它可能不是很有吸引力。但是在 Systemd 上使用微型 JSvc 服务包装器有一些优势。

如果你想 运行 tomcat 具有 non-root 权限但使用低端口(<1024),你应该使用 jsvc。

同时 disabling shutdown port 可用。它不能在 运行ning Tomcat 与标准 shell 脚本一起使用时使用,因为它会阻止 shutdown.bat|.sh 和 catalina.bat|.sh 停止它优雅。