
Eu tenho um túnel openvpn que executa um --up
script 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.target
diretiva, tenho uma condição de corrida: /var/run/mysqld/mysqld.sock pode existir quando o --up
script 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.service
e executá- systemctl daemon-reload
la resolveria o problema. No entanto, adicionei ls -lh /var/run/mysqld/mysqld.sock
no início do meu --up
script, 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 ConditionPathExists
um 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.