RHEL 7.8 - `service X start` 和 `systemctl start X` 之间的不同行为

RHEL 7.8 - `service X start` 和 `systemctl start X` 之间的不同行为

service我目前正在设置 RHEL 7.8 tomcat 服务,但在使用和命令时遇到了问题systemctl

上下文:以下文件已设置于/etc/init.d/tomcat

#!/bin/bash
#
#
# chkconfig: 2345 20 80
# description:  Start up the Tomcat servlet engine.

# Source function library.
. /etc/init.d/functions


RETVAL=$?
CATALINA_HOME="<tomcat 9 folder location>"
JAVA_HOME="/usr/java/jdk1.8.0_251"

case "$1" in
 start)
        if [ -f $CATALINA_HOME/bin/startup.sh  ];
          then
            echo $"Starting Tomcat"
            /bin/su saveweb -c "JAVA_HOME=$JAVA_HOME $CATALINA_HOME/bin/startup.sh"
        fi
        ;;
 stop)
        if [ -f $CATALINA_HOME/bin/shutdown.sh ];
          then
            echo $"Stopping Tomcat"
            /bin/su saveweb -c "JAVA_HOME=$JAVA_HOME $CATALINA_HOME/bin/shutdown.sh 15 -force"
        fi
        ;;
 *)
        echo $"Usage: $0 {start|stop}"
        exit 1
        ;;
esac

exit $RETVAL

这就是/运行/systemd/generator.late/tomcat.service文件:

# Automatically generated by systemd-sysv-generator

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/rc.d/init.d/tomcat
Description=SYSV: Start up the Tomcat servlet engine.
Before=runlevel2.target
Before=runlevel3.target
Before=runlevel4.target
Before=runlevel5.target
Before=rhnsd.service
After=network-online.target
After=network.service

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
ExecStart=/etc/rc.d/init.d/tomcat start
ExecStop=/etc/rc.d/init.d/tomcat stop

(说实话,我不知道这些文件是如何生成的,也不知道是谁生成的。我只是在利用别人给我的东西)

这对于大多数用例来说都很好(在系统启动时启动服务,使用systemctl start tomcatsystemctl stop tomcat)。我们还设置了 tomcat,使其设置环境变量定义一个CATALINA_PID变量,以便直接通过其脚本或通过启动/停止 tomcat 服务器systemctl就可以了。

这是因为有些用户可能会因为人为错误而启动两次 tomcat 服务。我们绝对不希望有两个 tomcat 实例。

因此,在测试时,一切似乎都运行正常。当我使用systemctl start tomcat两次时,只有 tomcat 服务的第一个实例会启动 - 正如预期的那样。

然而,有人指出,如果有人service tomcat start在之前的服务在线时使用,service程序将首先停止进而开始服务。

简而言之:

# this works fine!
systemctl start tomcat
systemctl start tomcat # effectivelly ignored, maybe some log saying that there was a previous instance online. Good!
service start tomcat
service start tomcat # logs show that "stop" was called and then the service was started again. not good.

我非常困惑,因为我到处都说这service只是 的包装器systemctl。那么到底是怎么回事呢?为什么service的行为与systemctl这种情况不同,应该怎么做才能修复它以使它们保持一致?

欢迎任何帮助。

答案1

serviceservice start确实是一个包装器,但是在文件存在的情况下工作的方式/etc/init.d/tomcat是停止现有实例,然后启动另一个实例。

您可以看到它的工作原理cat /sbin/service- 它实际上是一个小脚本,它说明了必须停止服务的原因:

由于 RemainAfterExit=yes,systemd 中异常死亡的 LSB 守护进程在 systemd 眼中仍然活着,让我们在下次启动之前收割它们

该文件/run/systemd/generator.late/tomcat.service由 SystemD 自身根据旧式启动脚本 生成/etc/init.d/tomcat。SystemDtomcat.service需要 才能在启动时或通过systemctl start等方式运行服务。

如果你必须使其service行为完全一样systemctl,最好的路线是为您的 Tomcat 实例准备一个“真正的” SystemD 单元文件。

来自存储库的软件包tomcat确实带有SystemD 单元(请注意/usr/lib/systemd/system/tomcat.service文件部分),因此很有可能您以一种奇特/非标准的方式安装了 Tomcat。

相关内容