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

Posted

技术标签:

【中文标题】与仅使用 systemd 相比,我从 JSVC 获得啥好处?【英文标题】:What benefit do I get from JSVC over just using systemd?与仅使用 systemd 相比,我从 JSVC 获得什么好处? 【发布时间】:2015-05-07 18:37:29 【问题描述】:

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

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

我一直在学习systemd,包括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 作为守护进程运行,JSVC 可以实现哪些 systemd 无法实现的功能?

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

【问题讨论】:

请注意,出于多种原因,许多系统管理员仍在避免切换到 systemd,我相信 JSVC 也将适用于传统的 init 系统。 不应该,After=remote-fs.target nss-lookup.target ? 【参考方案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 标准库的支持,这会造成很大的问题。

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

【讨论】:

我不会使用 startup.sh 脚本,但请确保直接启动 java 命令行。这导致更少的进程,systemd 可以直接跟踪 JVM 进程(用于重生)。 我知道的派对迟到了,但我发现这个article 真的很有帮助。作者清楚地知道他对 systemd 的了解。 我最终使用了catalalina.sh run,它将在当前窗口中运行,并且仍然执行运行 jar 所需的所有设置 @MarkGibson:我觉得文章搬家了,我找到了here @huch 它一直在移动。对于任何有兴趣的人,只需搜索“系统化的恐怖 tomcat 之家”。让人大开眼界。【参考方案2】:

此时,我将使用 JSvc。但是如果我必须的话,用一个 Systemd 脚本来包装它。

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

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

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

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

【讨论】:

感谢您的见解。他们非常有帮助。 在 systemd 脚本中包装 jsvc 时,是否应该使用 Type=forking ?【参考方案3】:

如果你想以非root权限运行tomcat但使用低端口(

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

【讨论】:

以上是关于与仅使用 systemd 相比,我从 JSVC 获得啥好处?的主要内容,如果未能解决你的问题,请参考以下文章

MPI + 线程并行化与仅 MPI 相比有啥优势(如果有)?

Flux Dispatcher 的目的是啥(与仅具有实例方法相比)

Dapper.net 的奇怪超时问题

使用jsvc启动tomcat

Jsvc安装,配置 常规用户使用tomcat的80端口

Tomcat篇01-概念简介和守护进程配置