Auf einem CentOS7-Server habe ich einen Anwendungsstapel, der aus einem Tomcat-Webserver und einem MySQL-DB-Server besteht, die beide auf derselben VM installiert sind.
Ich möchte, dass sie in dieser Reihenfolge zusammen starten und stoppen:
START: MySQL--> Tomcat STOP: Tomcat-->MySQL
Beim Lesen der Dokumentation der systemd-Units gelang es mir, sie zusammen mit Requires=
zum Laufen zu bringen Direktive, aber wenn ich Tomcat mit systemctl stop tomcat.service stoppe, läuft MySQL weiter. In Systemprotokollen ist mir aufgefallen, dass es nicht einmal versucht, MySQL zu stoppen, also muss etwas mit der systemd-Unit nicht stimmen.
Hier ist meine Einheit:
# 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
Akzeptierte Antwort:
Was Sie hier sehen, ist das erwartete systemd-Verhalten. Der Requires=
Abhängigkeit stellt sicher, dass mysql.service
wird immer dann gestartet, wenn tomcat.service
startet, aber einmal gestartet, sind die beiden Einheiten unabhängig und eine wird nicht gestoppt, wenn die andere es ist.
Wenn Sie wirklich mysql.service
wollen gestoppt werden, wenn tomcat.service
ist, können Sie den PartOf=
verwenden Direktive, die Einheiten beim Stoppen und Neustarten verbindet.
Für das von Ihnen beschriebene Beispiel (mit mysql.service
Stoppen Sie, wann immer tomcat.service
gestoppt ist), müssen Sie PartOf=tomcat.service
hinzufügen zur Definition von mysql.service
. Normalerweise ist der beste Weg, dies zu tun, eine Override-Datei zu verwenden, was Sie mit systemctl edit mysql.service
tun können was einen Texteditor mit einer leeren Datei öffnet, dann können Sie dieses Snippet hinzufügen:
[Unit]
PartOf=tomcat.service
Dies wird in einer Datei /etc/systemd/system/mysql.service.d/override.conf
gespeichert die Teil von mysql.service
wird , können Sie das mit systemctl cat mysql.service
überprüfen .
Nach diesen Änderungen und einem systemctl daemon-reload
, das sollte wie erwartet funktionieren…
In Bezug auf die Bestellung sollte alles wie erwartet mit dem einzelnen After=mysql.service
funktionieren Sie haben in tomcat.service
, da beim Beenden von Diensten die Abhängigkeiten in umgekehrter Reihenfolge beachtet werden. (Das bedeutet in diesem Fall tomcat.service
wird zuerst gestoppt, gefolgt von mysql.service
.)
Es ist vielleicht nicht immer eine gute Idee, Einheiten auf diese Weise zu stoppen… Vielleicht ist es ein etwas besserer Ansatz, eine separate .target
zu erstellen Einheit, um alle Dienste, die Sie steuern möchten, zu gruppieren. Vielleicht so etwas wie webservices.target
.
Sie erstellen diese Einheit mit Inhalten wie:
[Unit]
Description=Web Services
Requires=tomcat.service mysql.service
After=tomcat.target mysql.service
[Install]
WantedBy=multi-user.target
Und dann haben beide tomcat.service
und mysql.service
setzen Sie ein PartOf=webservices.target
, indem der oben beschriebene Überschreibungsmechanismus verwendet wird.
Aktivieren Sie die Target-Unit mit systemctl enable webservices.target
, und dann können Sie beide Dienste zusammen mit systemctl start webservices.target
starten und stoppen oder systemctl stop webservices.target
.