只使用systemd,我从JSVC获得了什么好处?

25 java tomcat jsvc systemd centos7

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

  1. 它以root身份启动,允许使用特权端口(如80或443).
  2. 它创建了一个"控制器进程",它将监视"受控进程"(主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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

我的偏好是只使用systemd,因为它已经存在,我必须(应该)使用它.然而,我不确定我是否会错过使用我忽略的JSVC的任何好处.

如果我想将Tomcat作为守护进程运行,那么JSVC可以实现的是systemd无法实现的?

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

zby*_*zek 18

通常,jsvc提供的大多数功能都是由systemd提供的,但打开特权端口除外(见下文).如果可能的话,切换到直接使用systemd功能是一个非常好的主意,因为事情变得更简单,更有效.

你的单元文件看起来很好,但是除了

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
Run Code Online (Sandbox Code Playgroud)

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

打开特权套接字

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

然后,守护程序可以作为非特权用户启动,并且不会自行删除权限.守护进程必须支持这个,而不是单独打开套接字,它应该使用它给出的那个.在Java下,由于缺乏对Java stdlib的支持,这很成问题.

AFAIK,tomcat不支持套接字激活,因此如果您想使用特权端口并在非特权用户下运行守护程序,则可能仍需要jsvc.

  • 我最终使用`catalalina.sh run`,它将在当前窗口中运行,并且仍然执行运行jar所需的所有设置 (4认同)
  • 我知道参加聚会迟到了,但我发现这篇 [文章](http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/systemd-house-of-horror/tomcat.html) 真的很有帮助。作者清楚地知道他关于 systemd 的东西。 (3认同)
  • @MarkGibson:我认为这篇文章已经移动了,我在[这里]找到了(https://jdebp.eu/FGA/systemd-house-of-horror/tomcat.html) (3认同)

ker*_*vin 7

此时,我将使用JSvc.但如果必须的话,用Systemd脚本包装它.

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

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

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

因此,对于您的特定Tomcat示例,它可能并不十分引人注目.但是在Systemd上使用微小的JSvc服务包装器有一些优点.