
Tengo un túnel openvpn que ejecuta un --up
script 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.target
directiva, tengo una condición de carrera: /var/run/mysqld/mysqld.sock puede existir cuando --up
se 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.service
y ejecutarla systemctl daemon-reload
funcionaría. Sin embargo, agregué ls -lh /var/run/mysqld/mysqld.sock
al comienzo de mi --up
secuencia 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 ConditionPathExists
verificació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.