作者:夜沙 | 来源:互联网 | 2023-05-19 10:55
Tomcat文档描述了编译和安装JSVC的过程,该过程可用于将Tomcat作为守护进程运行.据我了解,JSVC有两个好处:
它以root身份启动,允许使用特权端口(如80或443).
它创建了一个"控制器进程",它将监视"受控进程"(主Java线程)并在失败时重新启动进程.
我一直在学习systemd,包括服务单元配置.根据我的有限理解,如果我设置User=tomcat
(使用所需的用户名)并Restart=on-failure
在我的tomcat.service
配置文件中,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的好处.
1> zbyszek..:
通常,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.
我最终使用`catalalina.sh run`,它将在当前窗口中运行,并且仍然执行运行jar所需的所有设置
@MarkGibson:我认为这篇文章已经移动了,我在[这里]找到了(https://jdebp.eu/FGA/systemd-house-of-horror/tomcat.html)
2> kervin..:
此时,我将使用JSvc.但如果必须的话,用Systemd脚本包装它.
请记住,JSvc只是另一个可执行文件.因此,常规系统用户可以配置JSvc服务.可以肯定地说,在大多数发行版上,Systemd需要配置root权限.
我还编写了Java程序,它通过包装一个小的Java接口来使用JSvc和ProcRun.exe.这允许我在Unix和Windows操作系统上使用相同的服务代码甚至JUnit集成测试.所以我认为JSvc和ProcRun.exe一起促进跨平台服务代码.
JSvc有一些有趣的Java特定选项,可能对您有用.比如如何启动JVM(进程或DLL)等.你可以将很多这些写入Systemd脚本,但我怀疑你只是在那时用Bash重写JSvc.
因此,对于您的特定Tomcat示例,它可能并不十分引人注目.但是在Systemd上使用微小的JSvc服务包装器有一些优点.