Tomcat文档describes编译和安装JSVC的过程,可用于将Tomcat作为守护进程运行。根据我的理解,JSVC有两个好处:
我一直在学习systemd,包括service unit configuration。基于我的有限理解,如果我在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的好处
答案 0 :(得分:17)
通常,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。
答案 1 :(得分:7)
此时,我会使用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服务包装器有一些优点。
答案 2 :(得分:0)
如果要使用非root权限运行tomcat但使用低端口(< 1024),则应使用jsvc。
disabling shutdown port也可用。但是在使用标准shell脚本运行Tomcat时无法使用它,因为它会阻止shutdown.bat | .sh和catalina.bat | .sh正常停止它。