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

时间:2015-03-06 07:25:21

标签: java tomcat centos7 systemd jsvc

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

  1. 以root身份启动,允许使用特权端口(如80或443)。
  2. 它创建一个"控制器进程"这将监控一个"受控制的过程" (主Java线程)并在失败时重启进程。
  3. 我一直在学习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的好处

3 个答案:

答案 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脚本包装它。

  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。

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

答案 2 :(得分:0)

如果要使用非root权限运行tomcat但使用低端口(< 1024),则应使用jsvc。

disabling shutdown port也可用。但是在使用标准shell脚本运行Tomcat时无法使用它,因为它会阻止shutdown.bat | .sh和catalina.bat | .sh正常停止它。