与仅使用 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 相比有啥优势(如果有)?