Systemd-Startreihenfolge: Warten Sie auf mysql.sock

Systemd-Startreihenfolge: Warten Sie auf mysql.sock

Ich habe einen OpenVPN-Tunnel, der ein --upSkript ausführt, das eine lokale MySQL-Datenbank nach IP-Routing-Informationen abfragt und dann die Routen anwendet. Da jedoch sowohl die OpenVPN- als auch die MySQL-Systemd-Dienste mit der After=network.targetDirektive konfiguriert sind, besteht ein Race Condition: /var/run/mysqld/mysqld.sock kann vorhanden sein, wenn das --upSkript ausgeführt wird, muss es aber nicht. Wenn die Sock-Datei nicht vorhanden ist, stürzt mein Skript ab und das System wird nicht ordnungsgemäß initialisiert.

Ich dachte, dass das Ändern meiner openvpn.service-Direktive in After=network.target mysql.serviceund Ausführen systemctl daemon-reloaddas Problem lösen würde. Ich habe jedoch ls -lh /var/run/mysqld/mysqld.sockam Anfang meines --upSkripts hinzugefügt, und es meldet manchmal immer noch ls: cannot access '/var/run/mysqld/mysqld.sock': No such file or directory.

Ich vermute, dass systemd nicht die Sock-Datei verwendet, um zu bestimmen, ob mysqld fertig geladen ist oder nicht, sondern einige Kriterien, die vor der Erstellung der Sock-Datei erfüllt werden.

Gibt es eine Möglichkeit, systemd anzuweisen, mysql.service erst als gestartet zu erkennen, wenn die Sock-Datei erstellt wurde?

Antwort1

ich hatte das gleiche Problem, starten Sie einen anderen Dienst, nachdem MySQL gestartet wurde

Zuerst deaktiviere ich meinen Dienst

systemctl disable rfid-server

Danach habe ich meine rfid-server.service Datei geändert

[Unit]
Description=rfid server
After=mysql.service

[Service]
ExecStart=/opt/rfid-server-service/deploy/start.sh

[Install]
WantedBy=multi-user.target mysql.service

Und dann aktiviere ich meinen Dienst wieder

systemctl enable /complete/path/to/service

Created symlink from /etc/systemd/system/multi-user.target.wants/rfid-server.service to /opt/rfid-server-service/rfid-server.service.
Created symlink from /etc/systemd/system/mysql.service.wants/rfid-server.service to /opt/rfid-server-service/rfid-server.service.
Created symlink from /etc/systemd/system/rfid-server.service to /opt/rfid-server-service/rfid-server.service.

Wie Sie sehen, wird der Symlink zu mysql.service.wants erstellt.

Antwort2

Vielleicht sollten Sie ConditionPathExistsIhrer Servicedatei eine Prüfung hinzufügen?

Es gibt ein Zitat von systemdDokumentation:

Mit ConditionPathExists= wird vor dem Start einer Unit eine Dateiexistenzbedingung geprüft. Wenn der angegebene absolute Pfadname nicht existiert, schlägt die Bedingung fehl. Wenn dem an ConditionPathExists= übergebenen absoluten Pfadnamen ein Ausrufezeichen ("!") vorangestellt ist, wird der Test negiert und die Unit nur gestartet, wenn der Pfad nicht existiert.

verwandte Informationen