Порядок загрузки Systemd: Ожидание mysql.sock

Порядок загрузки Systemd: Ожидание mysql.sock

У меня есть туннель openvpn, который запускает --upскрипт, который запрашивает у локальной базы данных mysql информацию об IP-маршрутизации, а затем применяет маршруты. Однако, поскольку обе службы 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?

решение1

У меня была та же проблема, запустил какую-то другую службу после запуска 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

решение2

Может быть, вам следует добавить ConditionPathExistsпроверку в свой сервисный файл?

Есть цитата из systemdдокументация:

С ConditionPathExists= условие существования файла проверяется перед запуском модуля. Если указанное абсолютное имя пути не существует, условие не будет выполнено. Если абсолютное имя пути, переданное в ConditionPathExists=, имеет префикс в виде восклицательного знака ("!"), тест отрицается, и модуль запускается только в том случае, если путь не существует.

Связанный контент