31

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

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

我一直在学习systemd,包括服务单元配置。根据我有限的理解,如果我在我的配置文件中设置User=tomcat(使用所需的用户名) ,systemd 能够执行与 JSVC 相同的任务。Restart=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 的好处。

4

3 回答 3

22

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

您的单元文件看起来大部分都可以,除了

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

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

打开特权套接字

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

然后守护程序可以作为非特权用户启动,并且不会自行放弃特权。守护进程必须支持这一点,而不是自己打开套接字,它应该使用它给定的那个。在 Java 下,由于缺乏 Java 标准库的支持,这会造成很大的问题。

AFAIK,tomcat 不支持套接字激活,所以如果你想使用特权端口并在非特权用户下运行守护程序,jsvc 可能仍然是必要的。

于 2015-03-08T22:08:28.537 回答
8

在这一点上,我会使用 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 服务包装器有一些优势。

于 2015-03-14T14:35:05.723 回答
0

如果您想以非 root 权限但使用低端口(<1024)运行 tomcat,则应使用 jsvc。

也可以禁用关闭端口。但是,在使用标准 shell 脚本运行 Tomcat 时不能使用它,因为它会阻止 shutdown.bat|.sh 和 catalina.bat|.sh 优雅地停止它。

于 2016-01-14T10:42:00.363 回答