Ordem de inicialização do Systemd: Aguarde mysql.sock

Ordem de inicialização do Systemd: Aguarde mysql.sock

Eu tenho um túnel openvpn que executa um --upscript que consulta um banco de dados MySQL local para obter informações de roteamento IP e, em seguida, aplica as rotas. No entanto, como os serviços openvpn e mysql systemd estão configurados com a After=network.targetdiretiva, tenho uma condição de corrida: /var/run/mysqld/mysqld.sock pode existir quando o --upscript for executado ou não. Se o arquivo sock não existir, meu script morre e o sistema não inicializa corretamente.

Achei que mudar minha diretiva openvpn.service para After=network.target mysql.servicee executá- systemctl daemon-reloadla resolveria o problema. No entanto, adicionei ls -lh /var/run/mysqld/mysqld.sockno início do meu --upscript, e às vezes ainda reporta arquivos ls: cannot access '/var/run/mysqld/mysqld.sock': No such file or directory.

Meu palpite é que o systemd não está usando o arquivo sock para determinar se o mysqld terminou de carregar ou não, mas sim alguns critérios que acontecem antes do arquivo sock ser criado.

Existe uma maneira de dizer ao systemd para não reconhecer o mysql.service como iniciado até que o arquivo sock seja criado?

Responder1

eu tive o mesmo problema, inicie algum outro serviço depois que o mysql for iniciado

Primeiro eu desativo meu serviço

systemctl disable rfid-server

Depois disso, modifiquei meu arquivo 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

E eu reativo meu serviço

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 você pode ver, ele cria o link simbólico para mysql.service.wants

Responder2

Talvez você deva adicionar ConditionPathExistsum cheque em seu arquivo de serviço?

Há uma citação do systemddocumentação:

Com ConditionPathExists= uma condição de existência de arquivo é verificada antes de uma unidade ser iniciada. Se o nome do caminho absoluto especificado não existir, a condição falhará. Se o nome do caminho absoluto passado para ConditionPathExists= for prefixado com um ponto de exclamação ("!"), o teste será negado e a unidade só será iniciada se o caminho não existir.

informação relacionada