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 .