Redhat

RHEL 7.8 - service X startsystemctl start X 之間的不同行為

  • May 14, 2020

我目前正在設置 RHEL 7.8 tomcat 服務,並且在使用serviceandsystemctl命令時遇到了問題。

上下文:在/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

這是**/run/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,它的setenv.sh定義了一個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,應該做些什麼來修復它以使它們保持一致?

歡迎任何幫助。

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/tomcattomcat.serviceSystemD 需要 才能在啟動時啟動服務,或者當您通過 等執行它時systemctl start

如果您的行為必須service與完全相同systemctl,那麼最好的方法是為您的 Tomcat 實例提供一個“真實”的 SystemD 單元文件。

來自儲存庫的tomcat軟體包確實帶有一個 SystemD 單元(請注意/usr/lib/systemd/system/tomcat.service文件部分中的),因此您很可能以一種外來/非標準方式安裝了 Tomcat。

引用自:https://serverfault.com/questions/1017201