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 tomcat
和systemctl 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
service
service 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。