Orden de arranque de Systemd: espere mysql.sock

Orden de arranque de Systemd: espere mysql.sock

Tengo un túnel openvpn que ejecuta un --upscript que consulta una base de datos mysql local para obtener información de enrutamiento IP y luego aplica las rutas. Sin embargo, dado que los servicios openvpn y mysql systemd están configurados con la After=network.targetdirectiva, tengo una condición de carrera: /var/run/mysqld/mysqld.sock puede existir cuando --upse ejecuta el script o no. Si el archivo sock no existe, entonces mi script muere y el sistema no se inicializa correctamente.

Pensé que cambiar mi directiva openvpn.service After=network.target mysql.servicey ejecutarla systemctl daemon-reloadfuncionaría. Sin embargo, agregué ls -lh /var/run/mysqld/mysqld.sockal comienzo de mi --upsecuencia de comandos y, a veces, todavía informa ls: cannot access '/var/run/mysqld/mysqld.sock': No such file or directory.

Supongo que systemd no está usando el archivo sock para determinar si mysqld ha terminado de cargarse o no, sino algunos criterios que ocurren antes de que se cree el archivo sock.

¿Hay alguna manera de decirle a systemd que no reconozca que mysql.service se inició hasta que se haya creado el archivo sock?

Respuesta1

Tuve el mismo problema, inicié algún otro servicio después de iniciar mysql

Primero desactivo mi servicio.

systemctl disable rfid-server

Después de eso modifiqué mi archivo rfid-server.service

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

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

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

Y vuelvo a habilitar mi servicio.

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.

Como puede ver, crea el enlace simbólico a mysql.service.wants

Respuesta2

¿Quizás debería agregar ConditionPathExistsverificación en su archivo de servicio?

Hay una cita de systemd.documentación:

Con ConditionPathExists= se verifica la condición de existencia del archivo antes de iniciar una unidad. Si el nombre de ruta absoluta especificado no existe, la condición fallará. Si el nombre de la ruta absoluta pasado a ConditionPathExists= tiene el prefijo de un signo de exclamación ("!"), la prueba se niega y la unidad solo se inicia si la ruta no existe.

información relacionada