У меня есть туннель openvpn, который запускает --up
сценарий, который запрашивает информацию IP-маршрутизации в локальной базе данных mysql, а затем применяет маршруты. Однако, поскольку службы openvpn и mysql systemd настроены с After=network.target
директиве, у меня есть состояние гонки: /var/run/mysqld/mysqld.sock может существовать, когда --up
скрипт запускается, а может и нет. Если файл sock не существует, мой скрипт умирает, и система не инициализируется должным образом.
Я думал, что изменение моей директивы openvpn.service на After=network.target mysql.service
и бег systemctl daemon-reload
сделает свое дело. Однако я добавил ls -lh /var/run/mysqld/mysqld.sock
к началу моего --up
скрипт, и он все еще иногда сообщает ls: cannot access '/var/run/mysqld/mysqld.sock': No such file or directory
.
Я предполагаю, что systemd использует не файл sock для определения того, завершил ли mysqld загрузку, а скорее некоторые критерии, которые возникают до создания файла sock.
Есть ли способ сообщить systemd не распознавать mysql.service как запущенный до тех пор, пока файл sock не будет создан?
У меня была такая же проблема, запустите другую службу после запуска mysql
Сначала я отключаю свою службу
systemctl disable rfid-server
После этого я изменил свой файл 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
Я снова включаю свою службу
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.
Как видите, он создает символическую ссылку на mysql.service.wants
Может быть тебе стоит добавить ConditionPathExists
проверить в служебном файле?
Есть цитата из systemd документация:
С ConditionPathExists = условие существования файла проверяется перед запуском модуля. Если указанный абсолютный путь не существует, условие не выполняется. Если перед абсолютным именем пути, переданным в ConditionPathExists =, стоит префикс восклицательного знака («!»), Проверка отменяется, и модуль запускается только в том случае, если путь не существует.