В настоящее время я настраиваю службу 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 экзотическим / нестандартным способом.