GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Stoppen der Systemd-Einheit zusammen mit einer anderen. Beginn der Arbeiten?

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.

Verwandte:Bootstrap Date Picker funktioniert nur in der ersten Zeile von GridView?

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 .


Linux
  1. Linux – Wie bekommt man mit Systemd weniger Ttys?

  2. Warum stoppt Systemd den Dienst sofort nach dem Start?

  3. Wie konfiguriert man Systemd, um ein einfaches Skript mit Standardio in einen Netzwerkdienst umzuwandeln?

  4. So steuern Sie die Ressource (cgroup) mit systemd für die Benutzerprozessgruppe in CentOS/RHEL 7

  5. Wie stoppen Sie den systemd-Dienst

So führen Sie Jenkins Container als Systemd-Dienst mit Docker aus

So führen Sie Container als Systemd-Dienst mit Podman aus

Auflisten von Linux-Diensten mit Systemctl

Systemctl-Befehle zum Verwalten des Systemd-Dienstes

Jenkins mit Systemd und Docker installieren und ausführen

Verwalten von cgroups mit systemd