Назад | Перейти на главную страницу

RHEL 7.8 - Различное поведение между `service X start` и` systemctl start X`

В настоящее время я настраиваю службу Tomcat RHEL 7.8, и у меня проблемы с service и 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

И это /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 tomcat и systemctl 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 - это действительно небольшой скрипт, и в нем указывается причина остановки службы:

Демоны LSB, которые умирают ненормально в systemd, выглядят живыми в глазах systemd из-за RemainAfterExit = yes, давайте пожнем их перед следующим запуском

Файл /run/systemd/generator.late/tomcat.service генерируется самим SystemD из устаревшего сценария запуска /etc/init.d/tomcat. В tomcat.service требуется для SystemD, чтобы иметь возможность запускать службу во время загрузки или когда вы запускаете ее через systemctl start, и т.д.

если ты должен иметь service вести себя так же, как systemctlлучше всего иметь "настоящий" файл модуля SystemD для вашего экземпляра Tomcat.

В tomcat пакет из репозиториев поставляется с блок SystemD (Обратите внимание /usr/lib/systemd/system/tomcat.service в разделе файлов), так что, по всей вероятности, вы установили Tomcat экзотическим / нестандартным способом.