На сервере CentOS7 у меня есть стек приложений, состоящий из веб-сервера Tomcat и сервера базы данных MySQL, установленных на одной виртуальной машине. Я хотел бы, чтобы они начинались и заканчивались вместе в следующем порядке:

START: MySQL--> Tomcat
STOP: Tomcat-->MySQL

Читая документацию по модулям systemd, мне удалось запустить их вместе с директивой Requires=, но когда я останавливаю tomcat с помощью systemctl stop tomcat.service, MySQL продолжает работать. В системных журналах я заметил, что он даже не пытается остановить MySQL, значит, что-то не так с модулем systemd.

Вот мой агрегат:

# Systemd unit file for tomcat
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target mysql.service
Requires=mysql.service

[Service]
Type=forking

Environment=JAVA_HOME=/opt/jdk
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/bin/kill -15 $MAINPID

User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target
7
J.B. 26 Апр 2018 в 17:09
Подозреваю, что вы должны добавить до в mysql.service
 – 
hhoke1
26 Апр 2018 в 18:28

1 ответ

Лучший ответ

Здесь вы видите ожидаемое поведение systemd. Зависимость Requires= гарантирует, что mysql.service запускается всякий раз, когда запускается tomcat.service, но после запуска два модуля становятся независимыми, и один не будет остановлен, когда другой.

Если вы действительно хотите, чтобы mysql.service останавливался, когда tomcat.service останавливается, вы можете использовать PartOf= директива, которая связывает блоки при остановке и перезапуске.

Для описанного вами примера (остановка mysql.service всякий раз, когда tomcat.service останавливается), вам нужно добавить PartOf=tomcat.service к определению mysql.service. Обычно лучший способ сделать это — использовать файл переопределения, который вы можете сделать с помощью systemctl edit mysql.service, который откроет текстовый редактор с пустым файлом, затем вы можете добавить к нему этот фрагмент:

[Unit]
PartOf=tomcat.service

Это будет сохранено в файле /etc/systemd/system/mysql.service.d/override.conf, который станет частью mysql.service, вы можете проверить это с помощью systemctl cat mysql.service.

После этих изменений и systemctl daemon-reload это должно работать так, как вы ожидаете...

Что касается порядка, все должно работать так, как вы ожидаете, с единственным After=mysql.service, который у вас есть в tomcat.service, поскольку при остановке служб зависимости соблюдаются в обратном порядке. (Это означает, что в данном случае tomcat.service будет остановлен первым, а затем mysql.service.)


Остановка модулей таким образом может быть не всегда хорошей идеей... Возможно, несколько лучшим подходом является создание отдельного .target единица, чтобы сгруппировать все службы, которыми вы хотите управлять, вместе. Возможно что-то вроде webservices.target.

Вы должны создать этот модуль с таким содержимым, как:

[Unit]
Description=Web Services
Requires=tomcat.service mysql.service
After=tomcat.target mysql.service

[Install]
WantedBy=multi-user.target

А затем оба tomcat.service и mysql.service задают PartOf=webservices.target, используя механизм переопределения, описанный выше.

Включите целевое устройство с помощью systemctl enable webservices.target, после чего вы сможете запускать и останавливать обе службы вместе с systemctl start webservices.target или systemctl stop webservices.target.

18
filbranden 26 Апр 2018 в 18:55
Это в основном по памяти ... Если это все еще не работает для вас или если что-то неясно, пожалуйста, дайте мне знать, я могу связаться здесь, чтобы помочь вам понять это.
 – 
filbranden
26 Апр 2018 в 18:56
4
Работал очень хорошо, создавая webservices.target, как вы предложили. Обнаружил также существование systemctl edit ... Спасибо!
 – 
J.B.
15 Июн 2018 в 18:14